Pagini recente » Cod sursa (job #809030) | Cod sursa (job #2144836) | Cod sursa (job #2135289) | Cod sursa (job #3002776) | Cod sursa (job #2832180)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int numar_grafuri, numar_noduri, numar_muchii, nod_sursa;
int capat_stang, capat_drept, cost;
vector <vector <pair <int, int>>> lista_adiacenta;
void dijkstra(vector <int> &distante)
{
int nod, vizitat[numar_noduri + 1] = {};
priority_queue <pair <int, int>> coada;
for(int i = 1; i<= numar_noduri; i++)
distante[i] = INF;
distante[nod_sursa] = 0;
coada.push({0, nod_sursa});
while(coada.size() > 0)
{
nod = coada.top().second;
coada.pop();
if(!vizitat[nod])
vizitat[nod] = 1;
else
continue;
for(auto x : lista_adiacenta[nod])
if(distante[x.first] > distante[nod] + x.second)
{
distante[x.first] = distante[nod] + x.second;
coada.push(make_pair(-distante[x.first], x.first));
}
}
}
int main()
{
fin >> numar_grafuri;
for(int i = 0; i < numar_grafuri; i++)
{
int ok = 1;
fin >> numar_noduri >> numar_muchii >> nod_sursa;
lista_adiacenta.resize(numar_noduri + 1);
vector <int> distante(numar_noduri + 1, INF);
vector <int> d(numar_noduri + 1);
for(int j = 1; j <= numar_noduri; j++)
fin >> d[j];
for(int j = 1; j <= numar_muchii; j++)
{
fin >> capat_stang >> capat_drept >> cost;
lista_adiacenta[capat_stang].push_back(make_pair(capat_drept, cost));
lista_adiacenta[capat_drept].push_back(make_pair(capat_stang, cost));
}
dijkstra(distante);
for(int j = 1; j <= numar_noduri&&ok; j++)
if(d[j] != distante[j])
ok = 0;
if(ok)
fout << "DA\n";
else
fout << "NU\n";
lista_adiacenta.clear();
}
fin.close();
fout.close();
return 0;
}