Cod sursa(job #1427653)

Utilizator MciprianMMciprianM MciprianM Data 2 mai 2015 19:12:00
Problema Distante Scor 60
Compilator cpp Status done
Runda utcn_grafuri_training Marime 1.43 kb
#include <iostream>
#include <cstdio>
#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;
int q[MAXN], qfront, qback;


bool check(int src) {
	if(dz[src] != 0)	return false;
	int vec, cost_vec, dif;
	memset(u, 0, sizeof(u));
	qfront = 0; qback = 0;
	q[qback++] = src;
	u[src] = true;
	n--;
	while(qfront < qback) {
		src = q[qfront++];
		for(int i = 0, l = G[src].size(); i < l; i++) {
			vec = G[src][i].first;
			cost_vec = G[src][i].second;
			dif = dz[src] + cost_vec - dz[vec];
			if(dif == 0 && !u[vec]) {
				u[vec] = true;
				q[qback++] = vec;
				n--;
			}
			else if(dif < 0)	return false;
		}
	}
	return (n == 0);
}

int main() {
	int t;
	FILE *f = fopen("distante.in", "rt");
	FILE *g = fopen("distante.out", "wt");
	fscanf(f, "%d", &t);
	for(int i = 0; i < t; i++) {
		int m, s, a, b, c;
		fscanf(f, "%d%d%d", &n, &m, &s);
		s--;
		for(int j = 0; j < n; j++) {
			fscanf(f, "%d", &dz[j]);
			G[j].clear();
		}
		for(int j = 0; j < m; j++) {
			fscanf(f, "%d%d%d", &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) {
			fprintf(g, "DA\n");
		}
		else {
			fprintf(g, "NU\n");
		}
	}
	fclose(f);
	fclose(g);
	return 0;
}