Pagini recente » Cod sursa (job #246857) | Cod sursa (job #1140541) | Cod sursa (job #1356899) | Cod sursa (job #1572377) | Cod sursa (job #611831)
Cod sursa(job #611831)
#include <fstream>
#include <cstring>
#define distSize 50001
#define useSize 50001
#define lineSize 51
using namespace std;
ifstream IN;
ofstream OUT;
int dist[distSize];
int good;
inline void Read(int &N,int &M,int &Source)
{
IN>>N>>M>>Source;
for(int i=1;i<=N;++i)
IN>>dist[i];
good=1;
}
inline void Verify(int N,int M,int Source)
{
char line[lineSize];
if(dist[Source]!=0)
{
good=0;
++M;
for(;M--;) IN.getline(line,lineSize);
return;
}
int use[useSize];
int Count,x,y,c;
memset(use,0,sizeof(use));
use[Source]=1;
Count=1;
for(;M--;)
{
IN>>x>>y>>c;
if(dist[y]>dist[x]+c)
{
good=0;
++M;
for(;M--;) IN.getline(line,lineSize);
return;
}
else
if(dist[y]==dist[x]+c)
{
Count+=1-use[y];
use[y]=1;
}
if(dist[x]>dist[y]+c)
{
good=0;
++M;
for(;M--;) IN.getline(line,lineSize);
return;
}
else
if(dist[x]==dist[y]+c)
{
Count+=1-use[x];
use[x]=1;
}
}
if(Count!=N) good=0;
}
inline void Write()
{
if(good) OUT<<"DA\n";
else OUT<<"NU\n";
}
int main()
{
int Test,N,M,Source;
IN.open("distante.in");
OUT.open("distante.out");
IN>>Test;
for(;Test--;)
{
Read(N,M,Source);
Verify(N,M,Source);
Write();
}
IN.close();
OUT.close();
return 0;
}