Cod sursa(job #1193641)

Utilizator tudi98Cozma Tudor tudi98 Data 1 iunie 2014 13:02:31
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>
#include <queue>
#include <vector>
#include <cstring>

using namespace std;

#define inf 0x3f3f3f3f
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define dim 50005
#define ff first
#define ss second


ifstream f("distante.in");
ofstream g("distante.out");


bool seen[dim];
vector<pii> v[dim];
queue<int> Q;
int db[dim],s,a,b,c,u,nr,n,m,t,i;

void bellmanford(){

	if(db[s]!=0){
		g  <<"NU\n";
		return;
	}

	nr=1;
	memset(seen,0,sizeof(seen));
	Q=queue<int>();
	Q.push(s);
	seen[s]=1;
	while(!Q.empty()){
		u = Q.front();
		Q.pop();
		for(i=0;i<int(v[u].size());i++){
			if(db[u]+v[u][i].ss == db[v[u][i].ff] && !seen[v[u][i].ff]){
				 seen[v[u][i].ff]=1,nr++,Q.push(v[u][i].ff);
			}
			else if(db[u]+v[u][i].ss < db[v[u][i].ff]){
				g << "NU\n";
				return;
			} 
		}
	}

	if(nr != n) g <<"NU\n" ;
	else g << "DA\n";

}

int main(){

	f >> t;
	for(;t;t--){
		f >> n >> m >> s;
		for(i=1;i<=n;i++){
			f >> db[i];
		}

		for(i=1;i<=n;i++){
			v[i].clear();
		}

		for(i=1;i<=m;i++){
			f >> a >> b >> c;
			v[a].pb(mp(b,c));
			v[b].pb(mp(a,c));
		}
		
		bellmanford();
	}
}