Pagini recente » Cod sursa (job #3239118) | Cod sursa (job #584871) | Cod sursa (job #2285774) | Cod sursa (job #1390703) | Cod sursa (job #1526268)
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
#include <tuple>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
class comparePair {
public:
bool operator ()(const pair < int, int > A, const pair < int, int > B) {
return get<1>(A) > get<1>(B);
}
};
vector < int > getDistances(const int s, vector < vector < pair < int, int > > > const &G) {
priority_queue < pair < int, int >, vector < pair < int, int > >, comparePair > Q;
vector < int > dist(G.size(), 0x7fffffff);
int u, v, d, c;
dist[s] = 0;
Q.push(make_pair(s, 0));
while(!Q.empty()) {
u = get<0>(Q.top());
d = get<1>(Q.top());
Q.pop();
if(d == dist[u]) {
for(auto i : G[u]) {
v = get<0>(i);
c = get<1>(i);
if(dist[v] > d + c) {
dist[v] = d + c;
Q.push(make_pair(v, d + c));
}
}
}
}
return dist;
}
bool testDistances(const int s, vector < vector < pair < int, int > > > const &G, vector < int > const &dist) {
vector < int > trueDist = getDistances(s, G);
for(int i = 1; i < G.size(); i++) {
if(trueDist[i] != dist[i]) {
return false;
}
}
return true;
}
int main() {
int t, n, m, u, v, c, i, s;
vector < vector < pair < int, int > > > G;
vector < int > dist;
in >> t;
while(t--) {
in >> n >> m >> s;
G.assign(n + 1, vector < pair < int, int > >(0));
dist.assign(n + 1, 0);
for(i = 1; i <= n; i++) {
in >> dist[i];
}
for(i = 1; i <= m; i++) {
in >> u >> v >> c;
G[u].push_back(make_pair(v, c));
G[v].push_back(make_pair(u, c));
}
if(testDistances(s, G, dist) == true) out << "DA\n";
else out << "NU\n";
}
return 0;
}