Cod sursa(job #1497284)

Utilizator tiby10Tibi P tiby10 Data 6 octombrie 2015 16:53:44
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
#define MAXN 50005
#define INF 2e9
struct Edge{
    int v, c;
    Edge(int a, int b){
        v=a, c=b;
    }
};

vector<Edge> G[MAXN];
int n, t, vals[MAXN], D[MAXN];
bool inQ[MAXN];
queue<int> Q;

bool solve(int start){
    int i;
    for(int i=1; i<=n; ++i)
        D[i]=INF;
    D[start]=0;
    inQ[start]=1;
    Q.push(start);
    while(!Q.empty()){
        int node=Q.front(); Q.pop();
        inQ[node]=0;
        for(auto e : G[node])
            if(D[e.v]>D[node]+e.c){
                D[e.v]=D[node]+e.c;
                if(!inQ[e.v]){
                    inQ[e.v]=1;
                    Q.push(e.v);
                }
            }
    }
    for(i=1; i<=n; ++i)
        if(D[i]!=vals[i])
            return false;
    return true;
    Q=queue<int>();
}

int main()
{
    int m, s, a, b, c;
    fin>>t;
    while(t--){
        fin>>n>>m>>s;
        for(int i=1; i<=n; ++i)
            fin>>vals[i];
        while(m--){
            fin>>a>>b>>c;
            G[a].push_back(Edge(b, c));
            G[b].push_back(Edge(a, c));
        }
        solve(s)? fout<<"DA\n":fout<<"NU\n";
    }
    return 0;
}