Pagini recente » Cod sursa (job #515551) | Cod sursa (job #27687) | Cod sursa (job #1820334) | Cod sursa (job #2905661) | Cod sursa (job #2231342)
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <vector>
#include <set>
#define infinit 0x3f3f3f
using namespace std;
ofstream fout("distante.out");
int n, m, s; //n= nr noduri, s = sursa, m= nr muchii
int dist[50000]; //dist minime calculate de bronzel
void Dijkstra( const vector < vector< pair <int, int> > > &);
void citire()
{
ifstream fin ("distante.in");
if( !fin.is_open() || !fout.is_open() )
{
cout << "The file didn't open!\n";
exit (EXIT_FAILURE);
}
int t; //cate grafuri sunt pe foaie
fin >> t;
for(int j=1; j<=t; j++)
{
vector< vector <pair <int, int> > > la;
fin >> n >> m >> s;
for(int i=1; i<=n; i++)
fin >> dist[i];
la.resize(n+1);
for(int i=1; i<=m; i++)
{
int u, v, w;
fin >> u >> v >> w;
la[u].push_back({v, w});
la[v].push_back({u, w});
}
// cout << "the graph given is:\n";
// for(int i=1; i<=n; i++)
// { cout << i << ": ";
// for(int k=0; k< la[i].size(); k++)
// cout << la[i][k].first << "/" << la[i][k].second << " ";
// cout << endl;
// }
//cout << "the source is: " << s;
Dijkstra(la);
}
fin.close();
fout.close();
}
void Dijkstra(const vector < vector< pair <int, int> > > &la)
{
vector<int> d(n+1, infinit);
vector<int> tata(n+1, 0);
set<pair<int,int>> min_heap;
d[s] = 0;
min_heap.insert({d[s], s});
while(!min_heap.empty())
{
int u = min_heap.begin()->second;
min_heap.erase( min_heap.begin() );
for(int i=0; i<la[u].size(); i++)
{
int v = la[u][i].first;
int w = la[u][i].second;
if( d[v] > d[u] + w)
{
if( min_heap.find({d[v], v}) != min_heap.end() )
min_heap.erase( {d[v], v} );
d[v] = d[u] + w;
min_heap.insert({d[v], v});
}
}
}
// cout << endl << "the distances are: ";
// for(int i=1; i<=n; i++)
// if( d[i] == infinit )
// { d[i] = 0; cout << 0 << " ";}
// else
// cout<< d[i] << " ";
// cout << endl;
int ok = 1;
for(int i=1; i<=n; i++)
{
if( dist[i] != d[i] && d[i] != infinit )
{
fout << "NU\n";
ok = 0;
break;
}
}
if(ok == 1)
fout << "DA\n";
}
int main()
{
citire();
return 0;
}