Pagini recente » Cod sursa (job #484308) | Cod sursa (job #261278) | Cod sursa (job #984836) | Cod sursa (job #1834356) | Cod sursa (job #2907301)
#include <fstream>
#include <vector>
#include <queue>
#define INF 100000001
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int d[50011],D[50011],s;
bool inq[50011];
vector <pair<int,int>> v[50011];
void bellman_ford()
{
queue <int> q;
q.push(s);
inq[s]=1;
while(q.empty()==false)
{
int k=q.front();
q.pop();
inq[k]=0;
for(int i=0;i<v[k].size();i++)
if(d[v[k][i].first]>d[k]+v[k][i].second)
{
d[v[k][i].first]=d[k]+v[k][i].second;
if(d[v[k][i].first]<D[v[k][i].first])
return;
if(inq[v[k][i].first]==0)
{
inq[v[k][i].first]=1;
q.push(v[k][i].first);
}
}
}
}
int T,t,i,n,m,x,y,z;
int main()
{
fin>>T;
for(t=1;t<=T;t++)
{
fin>>n>>m>>s;
for(i=1;i<=n;i++)
{
v[i].clear();
d[i]=INF;
inq[i]=0;
fin>>D[i];
}
d[s]=0;
for(i=1;i<=m;i++)
{
fin>>x>>y>>z;
v[x].push_back(make_pair(y,z));
v[y].push_back(make_pair(x,z));
}
bellman_ford();
bool ok = true;
for(i=1;i<=n;i++)
if(d[i]!=D[i])
{
fout<<"NU"<<'\n';
ok = false;
break;
}
if(ok)
fout<<"DA"<<'\n';
}
return 0;
}