Cod sursa(job #1142690)

Utilizator classiusCobuz Andrei classius Data 14 martie 2014 08:14:56
Problema PScNv Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
using namespace std;

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

const int MAXN=300000;

map<pair<int,int>,int> mp;
vector<pair<int,int> > v[MAXN];
bool ok[MAXN];

int main(){
    freopen("pscnv.in","r",stdin);
    freopen("pscnv.out","w",stdout);

    int n,m,x,y;

    scanf("%d%d%d%d",&n,&m,&x,&y);

    for(int i=1;i<=m;i++){
        pair<int,int> pr;
        int ps;
        scanf("%d%d%d",&pr.first,&pr.second,&ps);

        if(pr.first==pr.second){
            continue;
        }

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

    int lf=0,rt=2000;

    while(lf<rt){
        int mid=(lf+rt)/2;
        memset(ok,0,sizeof(ok));
        queue<int> q;

        ok[x]=1;
        q.push(x);

        while(!q.empty()){
            int i=q.front();
            q.pop();

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

                if(!ok[u] && mid>=cs){
                    ok[u]=1;
                    q.push(u);
                }
            }
        }

        if(ok[y]){
            rt=mid;
        }else{
            lf=mid+1;
        }
    }

    printf("%d",rt);

    return 0;
}