Pagini recente » Cod sursa (job #3195783) | Cod sursa (job #1835562) | Cod sursa (job #353722) | Cod sursa (job #2137379) | Cod sursa (job #2389641)
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX = 50010;
const int INF = 1000000000;
int n, m, s, T;
int dist[NMAX], distB[NMAX];
vector< pair<int, int> > G[NMAX];
void Dijkstra(int s)
{
set<pair<int, int>> Q;
for(int i = 1; i <= n; i++)
dist[i] = INF;
dist[s] = 0;
Q.insert(make_pair(0, s));
while(!Q.empty())
{
int node = Q.begin()->second;
int d = Q.begin()->first;
Q.erase(Q.begin());
for(auto it = G[node].begin(); it != G[node].end(); it++)
{
int to = it->first;
int cost = it->second;
if(dist[to] > dist[node] + cost)
{
if(dist[to] != INF)
Q.erase(Q.find(make_pair(dist[to], to)));
dist[to] = dist[node] + cost;
Q.insert(make_pair(dist[to], to));
}
}
}
}
int main()
{
fin>>T;
for(;T>=1; T--)
{
fin>>n>>m>>s;
for(int i = 1; i <= n; i++)
fin>>distB[i];
for(int i = 1; i <= m; i++)
{
int to, from, cost;
fin>>to>>from>>cost;
G[to].push_back(make_pair(from, cost));
G[from].push_back(make_pair(to, cost));
}
Dijkstra(s);
bool ok = true;
for(int i = 1; i <= n && ok; i++)
if(distB[i] != dist[i])
ok = false;
if(ok)
fout<<"DA\n";
else
fout<<"NU\n";
for(int i = 1; i <= n; i++)
G[i].clear();
}
return 0;
}