Pagini recente » Cod sursa (job #1335740) | Cod sursa (job #1885344) | Cod sursa (job #404788) | Cod sursa (job #1100006) | Cod sursa (job #1604079)
#include <iostream>
#include <fstream>
#include <cstring>
#define inf 10000
using namespace std;
ifstream f ("distante.in");
ofstream g ("distante.out");
int a[100][100], din[100], d[100], t[100], v[100], n, m, st;
int check()
{
for(int i=1;i<=n;i++)
if(d[i]!=din[i]) return 0;
return 1;
}
void citire ()
{
f>>n>>m>>st;
for(int i=1;i<=n;i++)
f>>din[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j) a[i][j]=0;
else a[i][j]=inf;
int x, y, z;
for(int i=1;i<=m;i++)
{
f>>x>>y>>z;
a[x][y]=a[y][x]=z;
}
}
void dij (int x)
{
int minn, k, ok=1;
memset(d,inf,400);
for(int i=1;i<=n;i++)
{
d[i]=a[x][i];
if(d[i]<inf and d[i]<0)
t[i]=x;
}
v[x]=0;
t[x]=0;
while(ok)
{
minn=inf;
for(int i=1;i<=n;i++)
if(v[i]==0 and d[i]<minn)
{
minn=d[i];
v[i]=1;
k=i;
}
if(minn==inf)
ok=0;
else
{
v[k]=1;
for(int i=1;i<=n;i++)
if(v[i]==0 && d[i]>d[k]+a[k][i])
{
d[i]=d[k]+a[k][i];
t[i]=k;
}
}
}
}
int main()
{
int cate;
f>>cate;
for(int i=1;i<=cate;i++)
{
citire();
dij(st);
if(check()) g<<"DA\n";
else g<<"NU\n";
}
return 0;
}