Pagini recente » Cod sursa (job #2571104) | Cod sursa (job #625726) | Cod sursa (job #302099) | Cod sursa (job #146860) | Cod sursa (job #1478041)
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <algorithm>
#include <queue>
#include <utility>
#define NMAX 50005
#define INF 5000
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int n,m,t,xx,yy,s,cc,dc[NMAX],d[NMAX],val,y,nod;
bool inCoada[NMAX];
vector<int> a[NMAX],c[NMAX];
queue<int> coada;
void init()
{
in >> n >> m >> s;
for(int i=1;i<=n;i++)
{
d[i]=INF;
a[i].clear();
c[i].clear();
}
}
void citire()
{
for(int i=1;i<=n;i++)
in >> dc[i];
for(int i=0;i<m;i++)
{
in >> xx >> yy >> cc;
a[xx].push_back(yy);
a[yy].push_back(xx);
c[xx].push_back(cc);
c[yy].push_back(cc);
}
d[s]=0;
}
void bellmanFord()
{
coada.push(s);
while(!coada.empty())
{
nod = coada.front();
coada.pop();
inCoada[nod] = false;
for(int i=0;i<a[nod].size();i++)
{
if(d[a[nod][i]] > d[nod] + c[nod][i])
{
d[a[nod][i]] = d[nod] + c[nod][i];
if(!inCoada[a[nod][i]])
{
coada.push(a[nod][i]);
inCoada[a[nod][i]] = true;
}
}
}
}
}
void afisare()
{
for(int i=1;i<=n;i++)
if(d[i]!=dc[i])
{
out << "NU\n";
return;
}
out << "DA\n";
}
int main()
{
in >> t;
for(int i=0;i<t;i++)
{
init();
citire();
bellmanFord();
afisare();
}
return 0;
}