Cod sursa(job #928565)

Utilizator PatrikStepan Patrik Patrik Data 26 martie 2013 15:22:38
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
    #include<cstdio>
    #include<vector>
    #include<queue>
    using namespace std;
    #define MAX 30001
    #define pb push_back
    #define mp make_pair
    #define f first
    #define s second
    int N , M , x,y,dist;
    vector<pair<int,int> >G[MAX] ;
    queue<pair<int,int> > Q;
    bool viz[MAX];

    void citire();
    void solve();
    void tipar();

    int main()
    {
        citire();
        solve();
        tipar();
        return 0;
    }

    void citire()
    {
        int u , v , c;
        freopen("sate.in" , "r" , stdin );
        scanf("%d%d%d%d" ,&N , &M, &x , &y );
        for(int i = 1 ; i <= M ; ++i )
        {
            scanf("%d%d%d" , &u , &v , &c);
            G[u].pb(mp(v,c));
            G[v].pb(mp(u,c));
        }
    }

    void solve()
    {
        int aux;
        if(x==y)return;
        if(x>y){aux = x;x=y;y=aux;}
        Q.push(mp(x,0));
        while(!Q.empty())
        {
            int k = Q.front().f;
            int cost = Q.front().s;
            Q.pop();
            viz[k] = 1;
            for(int j = 0 ; j < (int)G[k].size() ; ++j )
                if(!viz[G[k][j].f])
                {
                    if(G[k][j].f == y)
                    {
                       if(y<k)dist = cost-G[k][j].s;
                       else dist = cost+G[k][j].s;
                       return;
                    }
                    if(G[k][j].f > k)Q.push(mp(G[k][j].f,cost+G[k][j].s));
                    else Q.push(mp(G[k][j].f,cost-G[k][j].s));
                }

        }
    }

    void tipar()
    {
        freopen("sate.out" , "w" , stdout );
        printf("%d\n" , dist);
    }