Pagini recente » Cod sursa (job #676801) | Cod sursa (job #3268250) | Cod sursa (job #2519141) | Cod sursa (job #1971268) | Cod sursa (job #2176339)
#include <bits/stdc++.h>
#define inf 99999999
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int d[50005],dPropus[50005],n,m,t,start;
bool inCoada[50005];
struct compara
{
bool operator()(int x,int y)
{
return d[x]>d[y];
}
};
priority_queue < int, vector <int>, compara> q;
int main()
{
fin>>t;
for(int i=1;i<=t;i++)
{
vector <pair <int, int> > nod[50005];
fin>>n>>m>>start;
for(int k=1;k<=n;k++) fin>>dPropus[k];
for(int k=1;k<=m;k++)
{
int x,y,c;
fin>>x>>y>>c;
nod[x].push_back(make_pair(y,c));
nod[y].push_back(make_pair(x,c));
}
for(int k=1;k<=n;k++) d[k]=inf,inCoada[k]=false;;
d[start]=0;
q.push(start);
inCoada[start]=true;
while(!q.empty())
{
int nodCur=q.top();
inCoada[nodCur]=false;
q.pop();
for(size_t k=0;k<nod[nodCur].size();k++)
{
int x=nod[nodCur][k].first;
int cost=nod[nodCur][k].second;
if(d[x]>d[nodCur]+cost)
{
d[x]=d[nodCur]+cost;
if(inCoada[x]==false)
{
q.push(x);
inCoada[x]=true;
}
}
}
}
int ok=1;
for(int k=1;k<=n;k++) if(d[k]!=dPropus[k]) ok=0;
if(ok==0) fout<<"NU\n";
else fout<<"DA\n";
}
return 0;
}