Pagini recente » Cod sursa (job #1456019) | Cod sursa (job #1410580) | Cod sursa (job #2880393) | Cod sursa (job #2346178) | Cod sursa (job #1833078)
#include <fstream>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
const int inf = 1e9;
int T, N, M, S;
vector <int> Sol, Dist;
vector <vector <pair<int,int> > > G;
priority_queue < pair<int,int> , vector <pair<int,int> > , greater<pair<int,int> > > Q;
void Dijkstra(int , vector<int> &);
int main()
{
f >> T;
for ( ; T ; --T)
{
f >> N >> M >> S;
Sol = vector <int> (N + 1);
for (int i = 1; i <= N; ++i)
f >> Sol[i];
G = vector<vector<pair<int,int> > >(N + 1);
for (int i = 1; i <= M; ++i)
{
int x, y, c;
f >> x >> y >> c;
G[x].push_back({c,y});
G[y].push_back({c,x});
}
Dijkstra(S,Dist);
int ok = 1;
for (int i = 1; i <= N && ok ; ++i)
if ( Sol[i] != Dist[i] )
ok = false;
if ( ok )
g << "DA\n";
else
g << "NU\n";
}
f.close();
g.close();
return 0;
}
void Dijkstra (int start , vector <int> & Dist )
{
Dist = vector<int> (N + 1, inf);
Dist[start] = 0;
Q.push({0,start});
for ( ; !Q.empty() ; )
{
int x = Q.top().second , dx = Q.top().first;
Q.pop() ;
if ( dx > Dist[x] )
continue;
for ( const pair<int,int> & p : G[x] )
{
int y = p.second , w = p.first;
if ( Dist[y] > Dist[x] + w )
{
Dist[y] = Dist[x] + w;
Q.push({Dist[y],y});
}
}
}
}