Cod sursa(job #864853)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 25 ianuarie 2013 20:02:30
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
#include <queue>

using namespace std;

#define Nmax 30001

struct nod{

    int vecin;
    int cost;
    nod *next;
};

nod *Graf[Nmax];

vector <int> dist;
queue <int> Q;

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

void citire(){

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

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

    dist.resize(N+1);

    for(; M; M--){

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

        nod *p = new nod;

        p->vecin = b;
        p->cost = c;
        p->next = Graf[a];
        Graf[a] = p;

        nod *t = new nod;

        t->vecin = a;
        t->cost = -c;
        t->next = Graf[b];
        Graf[b] = t;
    }
}

void dijkstra(){

    Q.push(inceput);

    while(!Q.empty()){

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

        nod *p = Graf[current];
        nod *c = p;

        while(c){

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

                dist[c->vecin] = dist[current] + c->cost;

                if(c->vecin == sfarsit)
                    return;

                Q.push(c->vecin);
            }

            c = c->next;
        }
    }
}

void afis(){

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

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

}

int main(){

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

    return 0;
}