Cod sursa(job #3330883)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 22 decembrie 2025 19:39:40
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1 kb
// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define err(...) fprintf(stderr, __VA_ARGS__)
using ll=long long;
using dbl=long double;
constexpr int NMAX=50'005;
constexpr ll MOD=1'000'000'007;

int N, M, S;
int d[NMAX];
int e[NMAX];

int root(int x)
{
	if(e[x]<0)
		return x;
	return e[x]=root(e[x]);
}

void merge(int a, int b)
{
	a=root(a);
	b=root(b);
	if(a==b)
		return;
	if(e[a]>e[b])
		std::swap(a, b);
	e[a]+=e[b];
	e[b]=a;
}

int main()
{
	FILE* f=fopen("distante.in", "r"), *g=fopen("distante.out", "w");
	int _, i, a, b, c;

	fscanf(f, "%d", &_);
	do
	{
		fscanf(f, "%d%d%d", &N, &M, &S);
		--S;
		std::fill(e, e+N, -1);
		for(i=0;i<N;++i)
			fscanf(f, "%d", d+i);
		for(i=0;i<M;++i)
		{
			fscanf(f, "%d%d%d", &a, &b, &c);
			--a;
			--b;
			if(std::abs(d[a]-d[b])==c)
				merge(a, b);
		}

		if(e[root(0)]==-N)
			fprintf(g, "DA\n");
		else
			fprintf(g, "NU\n");
	}while(--_);

	fclose(f);
	fclose(g);
	return 0;
}