Pagini recente » Cod sursa (job #1833854) | Cod sursa (job #2803029) | Cod sursa (job #1841990) | Cod sursa (job #48889) | Cod sursa (job #902198)
Cod sursa(job #902198)
#include<iostream>
#include<fstream>
#define NMAX 50002
#define inf 1 << 30
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
struct graf
{
int nod,cost;
graf* next ;
};
graf *a[NMAX];
int viz[NMAX],d[NMAX],dp[NMAX],n,m,k,T;
bool dijk(int s)
{
int min=0,poz=0;
for(int i=1; i<=n; i++)
if(i!=s)
d[i]=inf;
for(int i=1; i<=n; ++i)
{
min=inf;
for(int j=1; j<=n; ++j)
if(d[j]<min && !viz[j])
{
min=d[j];
poz=j;
}
viz[poz]=1;
graf*t=a[poz];
while(t)
{
if(d[t->nod]>d[poz]+t->cost)
d[t->nod]=d[poz]+t->cost;
t=t->next;
}
}
for(int i=1; i<=n; i++)
if(d[i]!=dp[i])
return 0;
return 1;
}
void add(int where,int what ,int cost )
{
graf* t=new graf;
t->nod=what;
t->cost=cost;
t->next=a[where];
a[where]=t;
}
void read_solve ()
{ int s,x,y,z;
in>>T;
while(T>0)
{
in>>n>>m>>s;
for(int i=1; i<=n; ++i)
in>>dp[i];
for(int i=1; i<=m; i++)
{
in>>x>>y>>z;
add(x,y,z);
}
if(dijk(s)==1)
out<<"DA"<<'\n';
else
out<<"NU"<<'\n';
T--;
}
}
int main ()
{
read_solve();
in.close();
out.close();
return 0;
}