Cod sursa(job #3330882)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 22 decembrie 2025 19:31:49
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 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];
std::vector<int> G[NMAX];

bool check()
{
	if(d[S])
		return 0;

	std::queue<int> q;
	int cnt=N-1;

	q.push(S);
	d[S]=-1;

	do
	{
		S=q.front();
		q.pop();
		for(int x : G[S])
			if(d[x]!=-1)
			{
				q.push(x);
				d[x]=-1;
				--cnt;
			}
	}while(!q.empty());

	return !cnt;
}

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;
		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(d[a]+c==d[b])
				G[a].push_back(b);
			if(d[b]+c==d[a])
				G[b].push_back(a);
		}

		if(check())
			fprintf(g, "DA\n");
		else
			fprintf(g, "NU\n");

		for(i=0;i<N;++i)
		{
			G[i].clear();
			G[i].shrink_to_fit();
		}
	}while(--_);

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