Cod sursa(job #864630)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 25 ianuarie 2013 15:20:23
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

#define inf 0x3f3f3f3f

typedef struct{

    long long vecin;
    long long cost;

} nod;

vector < vector <nod> > Graf;
vector <long long> dist;
queue <int> Q;

long long N, M;
long long inceput, sfarsit;
long long a, b, c;

void citire(){

    freopen("sate.in", "r", stdin);

    scanf("%d %d %d %d", &N, &M, &inceput, &sfarsit);

    Graf.resize(N+1);

    for(; M; M--){

        scanf("%d %d %d", &a, &b, &c);

        nod x = {b, c};
        nod y = {a, -c};

        Graf[a].push_back(x);
        Graf[b].push_back(y);
    }
}

void dijkstra(){

    dist.resize(N+1);
    Q.push(inceput);

    if(inceput == sfarsit)
        return;

    while(!Q.empty()){

        int current = Q.front();
        Q.pop();

        vector <nod> ::iterator it;

        for(it = Graf[current].begin(); it != Graf[current].end(); ++it){

            if(dist[it->vecin] == 0){

                dist[it->vecin] = dist[current] + it->cost;
                Q.push(it->vecin);

                if(it->vecin == sfarsit)
                    return;
            }
        }
    }
}

void afis(){

    freopen("sate.out", "w", stdout);

    printf("%lld\n", dist[sfarsit]);

}

int main(){

    citire();
    dijkstra();
    afis();

    return 0;
}