Cod sursa(job #1370080)

Utilizator HDT_TibiHudema Dumitru Tiberiu HDT_Tibi Data 3 martie 2015 12:54:42
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

struct Nod{int inf,val;Nod*leg;};
typedef Nod* nod;

nod L[50001];
queue<int> Q;
int cost[50001],n,m,v2[50001],v;

void add(int x, int y, int val)
{
    nod p=new Nod;
    p->inf=y;
    p->leg=L[x];
    p->val=val;
    L[x]=p;
}

void citire_graf()
{
    int i,x,y,val;
    fin>>n>>m>>v;

    for(i=1;i<=n; i++) {L[i]=NULL;cost[i]=999999999;}
    for(i=1; i<=n; i++) fin>>v2[i];

    for(i=1; i<=m; i++)
    {
        fin>>x>>y>>val;
        add(x,y,val);
        add(y,x,val);
    }
}

void verif(){
    for(int i=1; i<=n; i++)
        if(cost[i]!=v2[i]){
            fout<<"NU\n";
            return;
        }
    fout<<"DA\n";
}

void dj(int v)
{
    cost[v]=0;
    Q.push(v);
    while( !Q.empty() )
    {
        for(nod q=L[Q.front()];q;q=q->leg)
            if(cost[q->inf]>cost[Q.front()]+q->val)
            {
                cost[q->inf]=cost[Q.front()]+q->val;
                Q.push(q->inf);
            }
        Q.pop();
    }

}

int main()
{
    int t,i;
    fin>>t;
    for(i=1; i<=t; i++)
    {
        citire_graf();
        dj(v);
        verif();
    }
    return 0;
}