Cod sursa(job #732202)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 9 aprilie 2012 21:04:54
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
/*#include<iostream>
#include<fstream>
#include<vector>
#include<set>
#include<algorithm>

using namespace std;

#define maxn 50010
#define maxm 100010
#define inf 1000000000
#define pb push_back
#define mp make_pair

ifstream in("distante.in");
ofstream out("distante.out");

struct muchie
{
	long a,b,c;
} e[maxm];

long t,i,j,m,n,cost[maxn],f[maxn],c[maxn],k,s;
vector <long> v[maxn];
vector < pair<long,long> > h;

void init(long nod_sursa)
{
	cost[nod_sursa]=0;
	for(i=1;i<=n;i++)
		if(i!=nod_sursa)
			cost[i]=inf;
	for(i=1;i<=n;i++)
		f[i]=0;
	h.clear();
	h.pb(mp(0,nod_sursa));
	make_heap(h.begin(),h.end());
}

void bmf(long m, long n)
{
	pair<long,long> per;
	long nod,poz;
	long long pas=0;
	while(h.size() && pas<=1LL*m*n){
		++pas;
		pop_heap(h.begin(),h.end());
		per=h.back();
		h.pop_back();
		nod=per.second;
		f[nod]=0;
		for(j=0;j<v[nod].size();j++){
			poz=v[nod][j];
			if(cost[e[poz].a]+e[poz].c<cost[e[poz].b]){
				cost[e[poz].b]=cost[e[poz].a]+e[poz].c;
				if(!f[e[poz].b]){
					f[e[poz].b]=1;
					h.pb(mp(-cost[e[poz].b],e[poz].b));
					push_heap(h.begin(),h.end());
				}
			}
		}
	}
}

int main()
{
	char ok;
	in>>t;
	for(k=1;k<=t;k++){
		ok=1;
		in>>n>>m>>s;
		for(i=1;i<=n;i++)
			in>>c[i];
		for(i=1;i<=m;i++){
			in>>e[i].a>>e[i].b>>e[i].c;
			v[e[i].a].pb(i);
		}
		init(s);
		bmf(m,n);
		for(i=1;i<=m;i++)
			v[i].clear();
		/*for(i=1;i<h.size();i++)
			out<<h[i].first<<" "<<h[i].second<<" ";
		for(i=1;i<=n;i++)
			/*if(cost[i]!=c[i]){
				ok=0;
				break;
			}
			out<<cost[i]<<" ";
		if(ok)
			out<<"DA\n";
		else
			out<<"NU\n";
	}
	return 0;
}*/

#include<iostream>
#include<fstream>

using namespace std;

#define maxn 50010

ifstream in("distante.in");
ofstream out("distante.out");

long i,m,n,t,sol[maxn],a,b,c,s;

int main()
{
	char ok;
	in>>t;
	while(t--){
		ok=1;
		in>>n>>m>>s;
		for(i=1;i<=n;i++)
			in>>sol[i];
		if(sol[s]) ok=0;
		while(m--){
			in>>a>>b>>c;
			if(sol[a]+c<sol[b])
				ok=0;
		}
		if(ok)
			out<<"DA\n";
		else
			out<<"NU\n";
	}
	return 0;
}