Pagini recente » Cod sursa (job #561296) | Cod sursa (job #705895) | Cod sursa (job #1710166) | Cod sursa (job #1577448) | Cod sursa (job #2279819)
#include <fstream>
using namespace std;
ifstream f("distante.in"); ofstream g("distante.out");
int T,n,a[5010][5010],m,S,sol[50010];
int viz[50010],d[50010],mini,poz;
#define infinit 1010
void dijkstra(int x)
{ viz[x]=1;
for(int i=1;i<=n;++i)
{ d[i]=a[x][i];
///if( x != i ) if( d[i] < infinit ) tata[i]=x;
}
for(int i=1;i<=n-1;++i)
{ mini=infinit;
for(int j=1;j<=n;++j)
if( viz[j] == 0 and d[j] < mini )
{ mini=d[j]; poz=j;
}
viz[poz]=1;
for(int j=1;j<=n;++j)
if( viz[j] == 0 and d[j] > d[poz]+a[poz][j] )
{ d[j]=d[poz]+a[poz][j];
///tata[j]=poz;
}
}
}
int verif(int a[50010],int b[50010],int n)
{ for(int i=1;i<=n;++i)
if( a[i] != b[i] ) return 0;
return 1;
}
void citire()
{ f>>T;
while( T )
{ f>>n>>m>>S;
for(int i=1;i<=n;++i) f>>sol[i];
int x1=0,y1=0,z1=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j) if( i != j ) a[i][j]=infinit;
while( m )
{ f>>x1>>y1>>z1; a[x1][y1]=a[y1][x1]=z1;
m--;
}
dijkstra(S);
if( verif(sol,d,n) ) g<<"DA"<<'\n'; else g<<"NU"<<'\n';
for(int i=1;i<=n;++i) {viz[i]=0; d[i]=0;}
T--;
}
}
int main()
{ citire();
g.close();
return 0;
}