Pagini recente » Borderou de evaluare (job #921567) | Cod sursa (job #662622) | Cod sursa (job #2526345) | Cod sursa (job #189551) | Cod sursa (job #1101396)
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <limits>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
typedef vector<unsigned> vec_u;
typedef pair<unsigned,unsigned> pair_u;
typedef vector<pair_u> vec_pair_u;
typedef vector<bool> vec_b;
const unsigned INF = numeric_limits<unsigned>::max();
class Graph {
public:
Graph(size_t n) :
nNodes(n)
{
adLs.resize(n);
}
void addEdge(unsigned from, unsigned to, unsigned cost) {
adLs[from].push_back(pair_u(to,cost));
}
size_t getNNodes() {
return nNodes;
}
vector<vec_pair_u> adLs;
size_t nNodes;
};
bool isGood(Graph g, vec_u dists, unsigned src) {
if(dists[src]!=0)return false;
vec_b hasDist(dists.size(),false);
for(size_t i = 0; i < g.nNodes; ++i) {
for(auto &pr:g.adLs[i]) {
if(dists[i]+pr.second < dists[pr.first])
return false;
if(dists[i]+pr.second == dists[pr.first])
hasDist[pr.first] = true;
}
}
// for(size_t i = 0; i < hasDist.size(); ++i){
// if(!hasDist[i])return false;
// }
return true;
}
int main() {
size_t t;
in >> t;
while(t--) {
size_t n,m;
unsigned s;
in >> n >> m >> s;
Graph g(n);
vec_u bDists(n);
for(size_t i = 0; i < n; ++i)
in >> bDists[i];
for(size_t i = 0; i < m; ++i) {
unsigned a,b,c;
in >> a >> b >> c;
g.addEdge(a-1,b-1,c);
g.addEdge(b-1,a-1,c);
}
if(isGood(g,bDists,s-1))
out << "DA\n";
else
out << "NU\n";
}
}