Pagini recente » Cod sursa (job #827329) | Cod sursa (job #3162664) | Cod sursa (job #2355898) | Cod sursa (job #1278845) | Cod sursa (job #1533211)
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
struct muc{
int dest, cost; };
bool check_dist(const vector<vector<muc> >& graf, const vector<int>& de_verificat, const int surs){
const int n = graf.size();
vector<bool> verificat(n, false);
queue<int> de_viz;
if(de_verificat[surs] != 0){
return false; }
verificat[surs] = true;
de_viz.push(surs);
while(!de_viz.empty()){
const int cur = de_viz.front();
de_viz.pop();
for(const auto next : graf[cur]){
if(de_verificat[next.dest] > de_verificat[cur] + next.cost){
return false; }
if(!verificat[next.dest] && de_verificat[next.dest] == de_verificat[cur] + next.cost){
verificat[next.dest] = true;
de_viz.push(next.dest); } } }
return all_of(begin(verificat), end(verificat), [](const bool b){ return b; }); }
void do_test(ifstream& f, ofstream& g){
int n, m, s;
f >> n >> m >> s;
--s;
vector<int> de_verificat(n);
for(auto& x : de_verificat){
f >> x; }
vector<vector<muc> > graf(n);
for(int i = 0, a, b, c; i < m; ++i){
f >> a >> b >> c;
--a, --b;
graf[a].push_back((muc){b, c}); }
g << (check_dist(graf, de_verificat, s) ? "DA\n" : "NU\n"); }
int main(){
ifstream f("distante.in");
ofstream g("distante.out");
int t;
f >> t;
for(int i = 0; i < t; ++i){
do_test(f, g); }
return 0; }