Pagini recente » Cod sursa (job #2710257) | Cod sursa (job #2679480) | Cod sursa (job #2312959) | Cod sursa (job #2830902) | Cod sursa (job #2206573)
#include <fstream>
#include <vector>
#include <set>
#include <stdlib.h>
#define INF 0x3f3f3f3f
using namespace std;
bool Dijkstra(int n, const vector< vector < pair<int, int> > >& la, int sursa, vector<int>dist)
{
vector<int> d(n+1, INF);
set< pair<int, int> > Q;
int u, v;
int w;
d[sursa] = 0;
Q.insert({d[sursa], sursa});
while(!Q.empty())
{
u = Q.begin()->second;
Q.erase(Q.begin());
for(int i=0; i<la[u].size(); i++)
{
v = la[u][i].first;
w = la[u][i].second;
if( d[v] > (d[u] + w) )
{
if( Q.find({d[v], v}) != Q.end() )
Q.erase(Q.begin());
d[v] = d[u] + w;
Q.insert({d[v], v});
}
}
}
for(int i=1; i<=n; i++)
{
if(d[i] != dist[i-1] )
return false;
}
return true;
}
int main()
{
int n, m, s, t;
ifstream f("distante.in");
ofstream g("distante.out");
if( !f.is_open() || !g.is_open() )
exit(EXIT_FAILURE);
f >> t;
for(int i=1; i<= t; i++)
{
vector< vector <pair<int,int> > > la;
vector<int> dist;
f >> n >> m >> s;
la.resize(n+1);
dist.resize(n+1);
for(int j=0; j<n; j++)
{
int x;
f >> x;
dist[j] = x;
}
for(int j=1; j<=m; j++)
{
int x, y, c;
f >> x >> y >> c;
la[x].push_back({y,c});
la[y].push_back({x,c});
}
if ( Dijkstra(n, la, s, dist) == true )
g << "DA\n";
else
g << "NU\n";
}
f.close();
g.close();
return 0;
}