Pagini recente » Cod sursa (job #2019211) | Cod sursa (job #40714) | Cod sursa (job #1590856) | Cod sursa (job #1113629) | Cod sursa (job #1061245)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
#define MAX 50010
ifstream fin("distante.in");
ofstream fout("distante.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;
}
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];
}
for(i=1;i<=n;i++)
{
while(G[i].size())
G[i].pop_back();
}
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";
}
}