Pagini recente » Cod sursa (job #1086003) | Cod sursa (job #2229348) | Cod sursa (job #2722199) | Cod sursa (job #1111593) | Cod sursa (job #1449994)
#include<iostream>
#include<fstream>
using namespace std;
#define Infinity 9999;
ifstream f("distante.in");
ofstream g("distante.out");
int nrg,n,m,sr,a[100][100],cost[100];
void dij(int x)
{ int viz[100],i,ok,mini,k;
for(i=1;i<=n;i++)
{
viz[i]=0;
cost[i]=a[x][i];
}
viz[x]=1;
do{
mini=Infinity;
for(i=1;i<=n;i++)
if(viz[i]==0 && cost[i]<mini)
{
mini=cost[i];
k=i;
}
viz[k]=1;
for(i=1;i<=n;i++)
if(cost[i]>cost[k]+a[k][i] && viz[i]==0)
cost[i]=cost[k]+a[k][i];
ok=0;
for(i=1;i<=n;i++)
if(viz[i]==0)
ok=1;}while(ok==1);
}
int main()
{ int ok,gr=1,i,cost1[100],x,y,c,j;
f>>nrg;
while(gr<=nrg)
{
f>>n>>m>>sr;
ok=1;
for(i=1;i<=n;i++)
f>>cost1[i];
for(i=1;i<=m;i++)
{
f>>x>>y>>c;
a[x][y]=c;
a[y][x]=c;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]==0 && i!=j)
a[i][j]=Infinity;
dij(sr);
for(i=1;i<=n;i++)
if(cost1[i]!=cost[i])
ok=0;
if(ok==0)
g<<"NU"<<endl;
else
g<<"DA"<<endl;
gr++;
}
return 0;
}