Cod sursa(job #545049)

Utilizator avram_florinavram florin constantin avram_florin Data 2 martie 2011 17:17:54
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>

using namespace std;
const int MaxN = 50005;
const int Inf = 0x3f3f3f3f;

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

vector< vector< pair<int,int> > > G;
queue<int> Q;
int T,n,m,S,d[MaxN],dist[MaxN];
bool inQ[MaxN];

void bellman_ford(int S)
{
	int nod;
	vector< pair<int,int> >::iterator it,iend;
	memset(inQ,0,sizeof(inQ));
	memset(d,Inf,sizeof(d));
	d[S] = 0;
	inQ[S] = 1;
	Q.push(S);
	while( !Q.empty() )
		{
			nod = Q.front();
			Q.pop();
			inQ[S] = 0;
			iend = G[nod].end();
			it = G[nod].begin();
			for( ; it != iend ; ++it )
				if( d[it->first] > d[nod] + it->second )
					{
						d[it->first] = d[nod] + it-> second;
						if( !inQ[it->first] )
							{
								Q.push(it->first);
								inQ[it->first] = 1;
							}
					}
		}
}

int main()
{
	f >> T;
	int i;
	for( int ii = 1 ; ii <= T ; ii++ )
		{
			G.clear();
			f >> n >> m >> S;
			G.resize(n+1);
			for( i = 1 ; i <= n ; i++ )
				f >> dist[i];
			int x,y,c;
			for( i = 1 ; i <= m ; i++ )
				{
					f >> x >> y >> c;
					G[x].push_back(make_pair(y,c));
					G[y].push_back(make_pair(x,c));
				}
			bellman_ford(S);
			bool ok = true;
			for( i = 1 ; i <= n ; i++ )
				if( dist[i] != d[i] )
					{
						ok = false;
						break;
					}
			if( ok )
				g << "DA\n";
				else
				g << "NU\n";
		}
	return 0;
}