Cod sursa(job #1142702)

Utilizator classiusCobuz Andrei classius Data 14 martie 2014 08:38:11
Problema PScNv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
using namespace std;

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

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

const int MAXN=300000;
map<pair<int,int>,int> mp;
vector<pair<int,int> > v[MAXN];
int ds[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;
        }

        pair<int,int> pr;
        pr.first=x;
        pr.second=y;

        if(mp.find(pr)==mp.end()){
            mp[pr]=ps;
        }else{
            mp[pr]=min(ps,mp[pr]);
        }
    }

    for(map<pair<int,int>,int>::iterator it=mp.begin();it!=mp.end();it++){
        int x1,y1,cs;
        x1=it->first.first;
        y1=it->first.second;
        cs=it->second;

        v[x1].push_back(make_pair(y1,cs));
    }

    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();

        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;
}