Pagini recente » Cod sursa (job #1537725) | Cod sursa (job #92435) | Cod sursa (job #1099341) | Cod sursa (job #2081661) | Cod sursa (job #956184)
Cod sursa(job #956184)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <fstream>
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];
char now[10];
void BellmanFord(int startNode);
ifstream in("distante.in");
int get()
{
in >> now;
return atoi(now);
}
int main()
{
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
int i;
T = get();
for(; T; T --)
{
N=get();
M=get();
S=get();
//scanf("%i %i %i", &N, &M, &S);
for(i = 1; i <= N; i++) c[i] = get();
for(i = 1; i <= M; i++)
{
A=get();
B=get();
C=get();
//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");
for(i = 1; i <= N; i++) G[i].clear();
}
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);
}
}
}
}
}