Cod sursa(job #1808256)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 17 noiembrie 2016 16:07:22
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

const int N=50005,Inf=(1<<30);
int v[N],dist[N];
typedef pair<int, int> ii;
vector <ii> G[N];
priority_queue <ii, vector<ii>, greater<ii> > pq;

int main()
{
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);
    
    int i,j,d,y,x,t,n,m,rad,a,b,c;
    scanf("%d",&t);
    for(i=1;i<=t;i++){
			scanf("%d%d%d",&n,&m,&rad);
			for(j=1;j<=n;j++){
				scanf("%d",&v[j]);
				dist[j]=Inf;
			}
			for(j=1;j<=m;j++){
				scanf("%d%d%d",&a,&b,&c);
				G[a].push_back(ii(b,c));
				G[b].push_back(ii(a,c));
			}
			
			dist[rad]=0;
			pq.push(ii(0,rad));
			
			while(!pq.empty()){
				d=pq.top().first;
				x=pq.top().second;
				pq.pop();
				if(d>dist[x]) continue;
				
				for(j=0;j<(int)G[x].size();j++){
					y=G[x][j].first;
					d=G[x][j].second;
					
					if(dist[x]+d < dist[y]){
						dist[y]=dist[x]+d;
						pq.push(ii(dist[y],y));
					}
				}
			}
			
			bool sem=0;
			for(j=1;j<=n;j++)
				if(dist[j]!=v[j]) sem=1;
			
			if(sem==1) printf("Nu\n");
			else printf("DA\n");
			
			for(j=1;j<=n;j++)
				while(G[j].size()) G[j].pop_back();
    }
    
    return 0;
}