Pagini recente » Cod sursa (job #185348) | Cod sursa (job #2046684) | Cod sursa (job #1099884) | Cod sursa (job #1674538) | Cod sursa (job #1061239)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
#define MAX 50010
ifstream fin("drumuri.in");
ofstream fout("drumuri.out");
vector <pair<int, int> > G[MAX];
queue <int > coada;
int viz[MAX], n, m, t, a, s, b, c, i, rez[MAX], j;
bool solve()
{
while(!coada.empty())
coada.pop();
for(i=1;i<=n;i++)
{
viz[i]=0;
}
viz[s]=0;
if(viz[s]!=rez[s])
return 0;
coada.push(s);
while(coada.size())
{
i=coada.front();
coada.pop();
for(j=0;j<G[i].size();j++)
{
if(viz[i]+G[i][j].second<rez[G[i][j].first])
{
return 0;
}
if(viz[i]+G[i][j].second==rez[G[i][j].first])
{
viz[G[i][j].first]=viz[i]+G[i][j].second;
coada.push(G[i][j].first);
}
}
}
for(i=1;i<=n;i++)
{
if(viz[i]!=rez[i])
return 0;
}
return 1;
}
int main()
{
fin>>t;
while(t--)
{
fin>>n>>m>>s;
for(i=1;i<=n;i++)
{
fin>>rez[i];
}
while(m--)
{
fin>>a>>b>>c;
G[a].push_back(make_pair(b, c));
G[b].push_back(make_pair(a, c));
}
if(solve())
{
fout<<"DA\n";
}
else
fout<<"NU\n";
}
}