Pagini recente » Cod sursa (job #2811268) | Cod sursa (job #1371812) | Cod sursa (job #2641197) | Cod sursa (job #1478833) | Cod sursa (job #2175372)
#include <iostream>
#include <fstream>
#include <list>
#define INF 1<<30
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int t;
int n,s,m;
list <int> adj[50500],cost[50500];
int bronz[50500];
bool viz[50500];
int dist[50500];
bool dijkstra(int source)
{
for(int i=1;i<=n;++i)
viz[i]=0,dist[i]=INF;
dist[source]=0;
for(int i=1;i<n;++i)
{
int mn=0;
dist[0]=INF;
for(int j=1;j<=n;++j)
if(!viz[j] and dist[j]<dist[mn])
mn=j;
viz[mn]=1;
list <int> :: iterator it,jt;
for(it=adj[mn].begin(),jt=cost[mn].begin();it!=adj[mn].end();++it,++jt)
{
int u=*it;
int cat=*jt;
if(dist[u]>dist[mn]+cat)
dist[u]=dist[mn]+cat;
}
}
for(int i=1;i<=n;++i)
if(dist[i]!=bronz[i])
return false;
return true;
}
int main()
{
f>>t;
for(int i=1;i<=t;++i)
{
f>>n>>m>>s;
for(int j=1;j<=n;++j)
f>>bronz[j];
int a,b,c;
for(int j=1;j<=m;++j)
{
f>>a>>b>>c;
adj[a].push_back(b);
cost[a].push_back(c);
adj[b].push_back(a);
cost[b].push_back(c);
}
if(dijkstra(s))
g<<"DA"<<endl;
else
g<<"NU"<<endl;
}
return 0;
}