Cod sursa(job #1427644)

Utilizator MciprianMMciprianM MciprianM Data 2 mai 2015 18:56:41
Problema Distante Scor 60
Compilator cpp Status done
Runda utcn_grafuri_training Marime 1.29 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

static const int INF = 1000000000;
static const int MAXN = 50001;
typedef pair<int, int> pii;

vector<pii> G[MAXN];
int dz[MAXN];
int u[MAXN];
int n;


bool check(int src) {
	if(dz[src] != 0)	return false;
	int nodesLeft = n;
	queue<int> q;
	memset(u, 0, sizeof(u));
	q.push(src);
	u[src] = true;
	n--;
	while(!q.empty()) {
		src = q.front();
		q.pop();
		for(int i = 0, l = G[src].size(); i < l; i++) {
			if(dz[src] + G[src][i].second < dz[G[src][i].first])	return false;
			if(dz[src] + G[src][i].second == dz[G[src][i].first] && !u[G[src][i].first]) {
				u[G[src][i].first] = true;
				q.push(G[src][i].first);
				n--;
			}
		}
	}
	return (n == 0);
}

int main() {
	int t;
	ifstream f("distante.in");
	ofstream g("distante.out");
	f >> t;
	for(int i = 0; i < t; i++) {
		int m, s, a, b, c;
		f >> n >> m >> s;
		s--;
		for(int j = 0; j < n; j++) {
			f >> dz[j];
			G[j].clear();
		}
		for(int j = 0; j < m; j++) {
			f >> a >> b >> c;
			a--; b--;
			G[a].push_back(pii(b, c));
			G[b].push_back(pii(a, c));
		}
		bool areEqual = check(s);
		if(areEqual) {
			g << "DA\n";
		}
		else {
			g << "NU\n";
		}
	}
	f.close();
	g.close();
	return 0;
}