Pagini recente » Cod sursa (job #1471385) | Cod sursa (job #1625872) | Cod sursa (job #1994830) | Cod sursa (job #1998418) | Cod sursa (job #1533235)
#include <fstream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;
struct muc{
int surs, dest, cost; };
bool check_dist(const vector<muc>& graf, const vector<int>& de_verificat, const int surs){
const int n = graf.size();
vector<bool> verificat(n, false);
if(de_verificat[surs] != 0){
return false; }
verificat[surs] = true;
for(const auto x : graf){
if(de_verificat[x.surs] + x.cost == de_verificat[x.dest]){
verificat[x.dest] = true; }
if(de_verificat[x.surs] + x.cost < de_verificat[x.dest]){
return false; } }
return accumulate(begin(verificat), end(verificat), true, logical_and<bool>()); }
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<muc> graf(m);
for(int i = 0, a, b, c; i < m; ++i){
f >> graf[i].surs >> graf[i].dest >> graf[i].cost;
--graf[i].surs, --graf[i].dest; }
if(check_dist(graf, de_verificat, s)){
g << "DA\n"; }
else{
g << "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; }