Pagini recente » Cod sursa (job #311516) | Cod sursa (job #568739) | Cod sursa (job #602827) | Cod sursa (job #1525212) | Cod sursa (job #2824821)
#include <bits/stdc++.h>
#include<fstream>
#include<vector>
#include<map>
#include<queue>
std::ifstream f("distante.in");
std::ofstream g("distante.out");
int t, n, m, s, c, x, y, rez, suma_maxim = -1001;
std::vector<std::vector< std::pair<int, int>> > lista_cost;
std::vector<int> bronzarel;
void dijkstra(int nod){
std::vector<int> tata;
std::vector<int> dist;
std::vector<bool> viz;
for( int i=0 ; i<n ; i++)
{
dist.push_back(INT_MAX);
viz.push_back(false);
tata.push_back(-1);
}
dist[nod] = 0;
std::set<std::pair<int, int>> s;
s.insert( std::make_pair(0, nod));
while(!s.empty()){
int nod = s.begin()->second;
s.erase(s.begin());
for(auto i = lista_cost[nod].begin() ; i != lista_cost[nod].end(); i++){
int vecin = i->first;
int cost = i->second;
if(dist[vecin] > dist[nod] + cost){
s.erase(std::make_pair(dist[vecin], vecin));
dist[vecin] = cost + dist[nod];
tata[vecin] = nod;
s.insert(std::make_pair(dist[vecin], vecin));
}
}
}
int ok = 1;
for(int i = 0; i<n ; i++)
if(dist[i] != bronzarel[i]){
ok = 0;
break;
}
if(ok == 0 ) g<<"NU";
else g<<"DA";
g<<"\n";
}
int main() {
f>>t;
while(t--){
f>>n>>m>>s;
std::vector< std::pair<int, int>> p;
for(auto i = 0; i<n ; i++){
lista_cost.push_back(p);
bronzarel.push_back(-1);
}
for(int i = 0 ; i < n ; i++){
f >> x;
bronzarel[i] = x;
}
for(int i = 0 ; i < m ; i++) {
f >> x >> y >> c;
if(x != y){
lista_cost[x - 1].push_back(std::make_pair(y - 1, c));
lista_cost[y - 1].push_back(std::make_pair(x - 1, c));
}
}
dijkstra(s-1);
}
return 0;
}