Pagini recente » Cod sursa (job #1774261) | Cod sursa (job #1180673) | Cod sursa (job #3265730) | Cod sursa (job #2988046) | Cod sursa (job #3296836)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
#define dist first
#define nod second
int main()
{
int t;
f >> t;
while ( t -- )
{
vector < pair <int, int> > v[50001];
int n, m, s;
f >> n >> m >> s;
vector <int> sol(n + 1, INT_MAX / 2);
vector <int> c(n + 1, 0);
for ( int i = 1; i <= n; i ++ )
{
f >> c[i];
}
for ( int i = 1; i <= m; i ++ )
{
int startp, endp, dist;
f >> startp >> endp >> dist;
v[startp].push_back( { dist, endp } );
v[endp].push_back( { dist, startp } );
}
priority_queue <pair <int, int> > q;
q.push( { 0, s } );
sol[s] = 0;
while ( !q.empty() )
{
pair < int, int > aux = q.top();
q.pop();
if ( -aux.dist > sol[aux.nod] )
continue;
for ( int i = 0; i < v[aux.nod].size(); i ++ )
{
pair <int, int> edge = v[aux.nod][i];
if ( sol[edge.nod] > edge.dist + sol[aux.nod] )
{
sol[edge.nod] = edge.dist + sol[aux.nod];
q.push( { -sol[edge.nod], edge.nod } );
}
}
}
int ok = 0;
for ( int i = 1; i <= n; i ++ )
if ( c[i] != sol[i] )
{
g << "NU" << '\n';
ok = 1;
break;
}
if ( ok == 0 )
g << "DA" << '\n';
}
return 0;
}