Pagini recente » Cod sursa (job #2835593) | Cod sursa (job #2125972) | Cod sursa (job #2811971) | Cod sursa (job #1843634) | Cod sursa (job #2206578)
#include <fstream>
#include <vector>
#include <set>
#include <stdlib.h>
#define INF 0x3f3f3f3f
using namespace std;
vector<int> Dijkstra(int n, const vector< vector < pair<int, int> > >& la, int sursa)
{
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});
}
}
}
return d;
}
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++)
f >> dist[j];
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});
}
vector <int > d;
d = Dijkstra(n, la, s);
bool mistake = false;
for(int j=0; j < n; j++)
if( d[j+1] != dist[j] )
{
mistake = true;
break;
}
if ( !mistake )
g << "DA\n";
else
g << "NU\n";
}
f.close();
g.close();
return 0;
}