Cod sursa(job #1142703)

Utilizator classiusCobuz Andrei classius Data 14 martie 2014 08:40:04
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
using namespace std;

#include<fstream>
#include<vector>
#include<utility>
#include<cstring>
#include<queue>

ifstream cin("pscnv.in");
ofstream cout("pscnv.out");

const int MAXN=300000;
vector<pair<int,int> > v[MAXN];
int ds[MAXN];
bool ok[MAXN];

struct cmp{
    bool operator()(const pair<int,int>& p1,const pair<int,int>& p2){
        return p1.second>p2.second;
    }
};

int main(){

    int n,m,x,y;

    cin>>n>>m>>x>>y;
    cin.ignore();

    for(int i=1;i<=m;i++){
        int x,y,ps;
        char a[100];
        x=y=ps=0;

        cin.getline(a,100);

        unsigned j=0;

        while(a[j]!=' '){
            x=x*10+a[j]-'0';
            j++;
        }
        j++;
        while(a[j]!=' '){
            y=y*10+a[j]-'0';
            j++;
        }
        j++;
        while(j<strlen(a)){
            ps=ps*10+a[j]-'0';
            j++;
        }

        if(x==y){
            continue;
        }

        v[x].push_back(make_pair(y,ps));
    }

    for(int i=1;i<=n;i++){
        ds[i]=1<<30;
    }

    priority_queue <pair<int,int>, vector<pair<int,int> >, cmp> pq;

    ds[x]=0;
    pq.push(make_pair(x,0));

    while(!pq.empty()){
        int i=pq.top().first;
        int pd=pq.top().second;
        pq.pop();

        if(ok[i]){
            continue;
        }
        if(ok[y]){
            break;
        }
        ok[i]=1;

        for(unsigned j=0;j<v[i].size();j++){
            int u=v[i][j].first;
            int ps=v[i][j].second;

            if(ds[u]>max(ps,pd)){
                ds[u]=max(ps,pd);
                pq.push(make_pair(u,ds[u]));
            }
        }
    }

    cout<<ds[y];

    return 0;
}