Cod sursa(job #2476993)

Utilizator rebecca0312Andrei Rebecca rebecca0312 Data 19 octombrie 2019 14:08:44
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<cstdio>
#include<vector>
#include<set>

#define INF 1<<24
#define x first
#define y second

using namespace std;

int main(){
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
	int n,m,s,t;
	scanf("%d", &t);
	for(int k=1;k<=t;k++){
        scanf("%d%d%d", &n, &m, &s);
        int v[n+1];
        vector <vector <pair<int, int> > > G(n+1);
        vector <int> d(n+1, INF);
        set <pair <int, int> > q;
        for(int i=1;i<=n;i++)
            scanf("%d", &v[i]);
        for(int i=1;i<=m;i++){
            int x,y,c;
            scanf("%d%d%d", &x, &y, &c);
            G[x].push_back(make_pair(c, y));
            G[y].push_back(make_pair(c, x));
        }
        d[s]=0;
        q.insert(make_pair(0, s));
        while(!q.empty()){
            int nod=(*q.begin()).y;
            q.erase(q.begin());
            for(auto j: G[nod]){
                if(d[nod]+j.x<d[j.y]){
                    q.erase(make_pair(d[j.y], j.y));
                    d[j.y]=d[nod]+j.x;
                    q.insert(make_pair(d[j.y], j.y));
                }
            }
        }
        bool ok=true;
        for(int i=1;i<=n;i++){
            if(d[i]==INF)
                if(0!=v[i])
                    ok=false;
            if(d[i]!=v[i])
                ok=false;
        }
        if(ok==false)
            printf("NU\n");
        else
            printf("DA\n");
        d.clear();
        for(int i=1;i<=n;i++)
            G[i].clear();
	}
	return 0;
}