Cod sursa(job #1427694)

Utilizator MciprianMMciprianM MciprianM Data 2 mai 2015 21:06:25
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

static const int MAXN = 50009;
int dzt[MAXN];
bool u[MAXN];
int dad[MAXN];

int rep(int n) {
	if(dad[n] != n)	dad[n] = rep(dad[n]);
	return dad[n];
}

bool check(int s, int n) {
	for(int i = 0; i < n; i++) {
		if(rep(i) != s)	return false;
	}
	return true;
}

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 n, m, s, a, b, c;
		fscanf(f, "%d%d%d", &n, &m, &s);
		s--;
		for(int j = 0; j < n; j++) {
			fscanf(f, "%d", &dzt[j]);
			dad[j] = j;
		}
		bool are_equal = (dzt[s] == 0);
		memset(u, 0, sizeof(u));
		for(int j = 0; j < m; j++) {
			fscanf(f, "%d%d%d", &a, &b, &c);
			a--; b--;
			if(dzt[a] + c == dzt[b] && (c > 0 || dad[b] == b))	dad[b] = a;
			else if(dzt[b] + c == dzt[a] && (c > 0 || dad[a] == a))	dad[a] = b;
			if(dzt[a] + c < dzt[b] || dzt[b] + c < dzt[a])	are_equal = false;

		}
		if(are_equal) are_equal = check(s, n);
		
		if(are_equal) {
			fprintf(g, "DA\n");
		}
		else {
			fprintf(g, "NU\n");
		}
	}
	fclose(f);
	fclose(g);
	return 0;
}