Pagini recente » Cod sursa (job #546022) | Cod sursa (job #819369) | Cod sursa (job #541315) | Cod sursa (job #3160861) | Cod sursa (job #778193)
Cod sursa(job #778193)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
#define nmax 50010
#define pb push_back
#define mp make_pair
#define to first
#define cost second
vector<pair<int, int> > G[nmax];
int N, M, T, A, B, C, S;
int c[nmax], BFcost[nmax];
bool InQueue[nmax];
void BellmanFord(int startNode);
int main()
{
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
int i;
scanf("%i", &T);
for(; T; T --)
{
scanf("%i %i %i", &N, &M, &S);
for(i = 1; i <= N; i++) scanf("%i", &c[i]);
for(i = 1; i <= M; i++)
{
scanf("%i %i %i", &A, &B, &C);
G[A].pb(mp(B, C));
G[B].pb(mp(A, C));
}
BellmanFord(S);
bool ok = false;
for(i = 1; i <= N && !ok; i++)
if(BFcost[i] != c[i])
ok = true;
if(ok) printf("NU\n");
else printf("DA\n");
}
scanf("%i", &i);
return 0;
}
void BellmanFord(int startNode)
{
int i;
for(i = 1; i <= N; i++) BFcost[i] = 0x3f3f3f3f, InQueue[i] = false;
BFcost[startNode] = 0;
queue<int> Q;
Q.push(startNode);
InQueue[startNode] = true;
vector<pair<int, int> > :: iterator it;
while(!Q.empty())
{
int node = Q.front();
Q.pop();
InQueue[node] = false;
for(it = G[node].begin(); it != G[node].end(); ++ it)
{
if(BFcost[it -> to] > BFcost[node] + it -> cost)
{
BFcost[it -> to] = BFcost[node] + it -> cost;
if(!InQueue[it -> to])
{
InQueue[it -> to] = true;
Q.push(it -> to);
}
}
}
}
}