Pagini recente » Cod sursa (job #2664539) | Cod sursa (job #2184413) | Cod sursa (job #587163) | Cod sursa (job #1206012) | Cod sursa (job #2175455)
#include <fstream>
#include <vector>
#include <queue>
#define Nmax 50009
#define Emax 100009
#define INF 2<<30
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
typedef pair <int, int> edge;
#define x first
#define c second
int n,m,S,T,d[Nmax],x,y,c,verif[Nmax];
vector <edge> G[Nmax];
struct compare {
bool operator() (const edge &a, const edge &b) const {
return d[a.x]<d[b.x];
}
};
priority_queue <edge, vector<edge>, compare> Q;
void Clearcontent(int n) {
for (int i=1; i<=n; ++i) d[i]=INF;
for (int i=1; i<=n; ++i) G[i].clear();
}
void ReadInput() {
f>>n>>m>>S;
Clearcontent(n);
for (int i=1; i<=n; ++i) f>>verif[i];
for (int i=1; i<=m; ++i) {
f>>x>>y>>c;
G[x].push_back(edge(y,c));
G[y].push_back(edge(x,c));
}
}
void Dijkstra(int source) {
d[source]=0;
Q.push(edge(source,0));
while (!Q.empty()) {
edge aux = Q.top();
Q.pop();
int node=aux.x;
int cost=aux.c;
for (auto it: G[node]) {
int x=it.x;
int c=it.c;
if (d[x]==INF || d[x]> d[node] + c) {
d[x] = d[node] + c;
Q.push( edge( x, d[x]) );
}
}
}
}
void Solve() {
ReadInput();
// for (int i=1; i<=n; ++i) {
//
// g<<i<<": ";
// for (auto x: G[i]) g<<"("<<x.x<<' '<<x.c<<") ";
// g<<'\n';
// }
Dijkstra(S);
// for (int i=1; i<=n; ++i) g<<d[i]<<' ';
// g<<'\n';
for (int i=1; i<=n; ++i)
if (d[i]!=verif[i]) {
g<<"NU\n";
return;
}
g<<"DA\n";
}
int main() {
f>>T;
for (int i=1; i<=T; ++i)
Solve();
f.close(); g.close();
return 0;
}