Pagini recente » Cod sursa (job #2560430) | Cod sursa (job #265081) | Cod sursa (job #997138) | Cod sursa (job #2164023) | Cod sursa (job #2194695)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 50005
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");;
int N,M,S,T;
int Dist[NMAX];
int D[NMAX];
bool InQ[NMAX];
vector < pair<int,int> > G[100005];
const int Inf = 1<<30;
struct compare
{
bool operator()(int a,int b)
{
return D[a] > D[b];
}
};
priority_queue<int, vector<int>, compare> Q;
void Clear()
{
for(int i=1;i<=N;i++)
G[i].clear();
}
void Dijkstra(int start)
{
for(int i=1;i<=N;i++)
D[i] = Inf;
D[start] = 0;
InQ[start] = true;
Q.push(start);
while(!Q.empty())
{
int nod = Q.top();
Q.pop();
InQ[nod] = false;
for(auto &i: G[nod])
{
int vecin = i.first;
int cost = i.second;
if (D[vecin] > D[nod] + cost)
{
D[vecin] = D[nod] + cost;
if (!InQ[vecin])
{
InQ[vecin] = 1;
Q.push(vecin);
}
}
}
}
}
void Solve()
{
fin>>N>>M>>S;
for(int i=1;i<=N;i++)
fin>>Dist[i];
for(int i=1;i<=M;i++)
{
int a,b,c;
fin>>a>>b>>c;
G[a].push_back(make_pair(b,c));
G[b].push_back(make_pair(a,c));
}
Dijkstra(S);
for(int i=1;i<=N;i++)
if (D[i] != Dist[i])
{
fout<<"NU\n";
Clear();
return;
}
fout<<"DA\n";
Clear();
}
int main()
{
fin>>T;
for(int i=1;i<=T;i++)
Solve();
return 0;
}