Cod sursa(job #932358)

Utilizator gabrielvGabriel Vanca gabrielv Data 28 martie 2013 21:01:37
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <vector>

#define NMAX 50100
#define minim(a,b) ((a<b)?(a):(b))
#define oo 1<<30

using namespace std;

int N,M,S;

int A[NMAX];

bool ok;

struct node_structure {
    int vecin,cost;
};

vector < node_structure > G[NMAX];

void Read() {

    int x,y,c;
    scanf("%d%d%d",&N,&M,&S);
    for(int i=1;i<=N;++i)
        scanf("%d",&A[i]);
    while(M--) {
        scanf("%d%d%d",&x,&y,&c);
        G[x].push_back({y,c});
        G[y].push_back({x,c});
    }
}

void Verif_Dijkstra(int sursa) {

    int i,dist;
    unsigned j;

    ok=true;

    for(i=1;i<=N;++i) {

        if(i==sursa)
            continue;

        dist=oo;
        for(j=0;j<G[i].size();++j)
            dist=minim(dist,G[i][j].cost+A[G[i][j].vecin]);
        if(dist != A[i]) {
            ok=false;
            return;
        }
    }
}

void Print() {

    if(ok)
        printf("DA\n");
    else
        printf("NU\n");
}

int main() {

    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);

    int T;

    scanf("%d",&T);
    while(T--) {
        Read();
        Verif_Dijkstra(S);
        Print();
    }
    return 0;
}