Cod sursa(job #476328)

Utilizator Addy.Adrian Draghici Addy. Data 10 august 2010 18:40:26
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

#define NMAX 50050
#define INF 1 << 30

int cost[NMAX], C[NMAX], viz[NMAX], n, m, s, t;
vector < pair <int, int> > G[NMAX];
queue <int> Q;

void read ();
void bellman_ford ();
int check ();

int main () {
	
	freopen ("distante.in", "r", stdin);
	freopen ("distante.out", "w", stdout);
	
	scanf ("%d", &t);
	
	for ( ; t--; ) {
		read ();
		bellman_ford ();
		if (check ())
			printf ("DA\n");
		else
			printf ("NU\n");
	}
	
	return 0;
}

void read () {
	
	int i, x, y, c;
	
	scanf ("%d %d %d", &n, &m, &s);
	
	for (i = 1; i <= n; i++) {
		scanf ("%d", &cost[i]);
		G[i].clear ();
	}
	
	for (i = 1; i <= m; i++) {
		scanf ("%d %d %d", &x, &y, &c);
		G[x].push_back (make_pair (y, c));
		G[y].push_back (make_pair (x, c));
	}
}

void bellman_ford () {
	
	int i, nod, fiu, cst;
	
	for (i = 1; i <= n; i++)
		C[i] = INF, viz[i] = 0;
	
	Q.push(s), viz[s] = 1, C[s] = 0;
	while (!Q.empty()) {
		nod = Q.front();
		for (i = 0; i < (int) G[nod].size(); i++) {
			fiu = G[nod][i].first, cst = G[nod][i].second;
			if (C[nod] + cst < C[fiu]) {
				C[fiu] = C[nod] + cst;
				if (!viz[fiu])
					Q.push(fiu), viz[fiu] = 1;
			}
		}
		Q.pop();
	}
}

int check () {
	
	int i;
	
	for (i = 1; i <= n; i++)
		if (cost[i] != C[i])
			return 0;
	return 1;
}