Pagini recente » Cod sursa (job #2344514) | Cod sursa (job #3169591) | Cod sursa (job #2507293) | Cod sursa (job #339458) | Cod sursa (job #523178)
Cod sursa(job #523178)
// http://infoarena.ro/problema/distante
#include <fstream>
#include <vector>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int nrGraphs;
int nodes,edges,startNode;
vector<int> dist;
vector<bool> canBeAchieved;
void solve();
int main() {
in >> nrGraphs;
dist.resize(50001);
canBeAchieved.resize(50001);
for(int step=1;step<=nrGraphs;step++) {
in >> nodes >> edges >> startNode;
solve();
}
in.close();
out.close();
return (0);
}
void solve() {
int from,to,cost;
bool ok = true;
canBeAchieved.assign(nodes+1,false);
for(int i=1;i<=nodes;i++)
in >> dist.at(i);
if(dist.at(startNode))
ok = false;
if(ok)
for(int i=1;i<=edges;i++) {
in >> from >> to >> cost;
// doua conditii fiindca graful e neorientat
if(dist.at(from) + cost < dist.at(to) && dist.at(to) + cost < dist.at(from)) {
ok = false;
break;
}
// doua conditii fiindca graful e neorientat
if(dist.at(from) + cost == dist.at(to))
canBeAchieved.at(to) = true;
if(dist.at(to) + cost == dist.at(from))
canBeAchieved.at(from) = true;
}
if(ok)
for(int currentNode=1;currentNode<=nodes;currentNode++)
if(currentNode != startNode)
if(!canBeAchieved.at(currentNode)) {
ok = false;
break;
}
if(ok)
out << "DA\n";
else
out << "NU\n";
}