Cod sursa(job #250503)

Utilizator swift90Ionut Bogdanescu swift90 Data 31 ianuarie 2009 00:22:48
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>
#include<vector>
#define lg 50100
#define INF 0x3f3f3f3f
using namespace std;
typedef pair<int,int> graf;
vector <graf> nr[lg];
int C[lg],cost[lg],coada[10*lg],cnt[lg],apar[lg];
int rasp(int n){
	int i;
	for(i=1;i<=n;++i){
		if(C[i]!=cost[i])
			return 0;
	}
	return 1;
}
void solve(){
	int n,m,s,i,st,dr,a,b,c;
	scanf("%d%d%d",&n,&m,&s);
	for(i=1;i<=n;++i)
		scanf("%d",&C[i]);
	for(i=0;i<m;++i){
		scanf("%d%d%d",&a,&b,&c);
		++cnt[a];
		++cnt[b];
		nr[a].push_back(graf(b,c));
		nr[b].push_back(graf(a,c));
	}
	for(i=1;i<=n;++i)
		cost[i]=INF;
	coada[0]=s;
	st=dr=0;
	cost[s]=0;
	while(st<=dr){
		a=coada[st];
		for(i=0;i<cnt[a];++i){
			b=nr[a][i].first;
			c=nr[a][i].second;
			if(c+cost[a]<cost[b]){
				cost[b]=c+cost[a];
				if(!apar[b])
					coada[++dr]=b, apar[b]=1;
			}
		}
		++st;
		apar[a]=0;
	}
	
	if(rasp(n))
		printf("DA\n");
	else
		printf("NU\n");
	for(i=1;i<=n;++i){
		nr[i].clear();
		cnt[i]=0;
	}
}
int main(){
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	int t;
	scanf("%d",&t);
	for(;t;--t)
		solve();
	fclose(stdin);
	fclose(stdout);
	return 0;
}