Pagini recente » Cod sursa (job #1856463) | Cod sursa (job #776830) | Cod sursa (job #1196044) | Cod sursa (job #943838) | Cod sursa (job #1533234)
#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; }
g << (check_dist(graf, de_verificat, s) ? "DA" : "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; }