Pagini recente » Cod sursa (job #582096) | Cod sursa (job #3134402) | Cod sursa (job #2383253) | Cod sursa (job #2176696) | Cod sursa (job #794710)
Cod sursa(job #794710)
#include <vector>
#include <fstream>
#include <queue>
using namespace std;
#define INFILE "distante.in"
#define OUTFILE "distante.out"
#define pb push_back
#define pii pair<int,int>
#define NMAX 50010
#define inf 50000000
vector< vector< pii > > e;
int n, dist[NMAX], d[NMAX];
priority_queue<pii, vector<pii >, greater<pii > > q;
void dijkstra(int start) {
for(int i=0; i<n; i++)
dist[i] = inf;
q.push(make_pair(0, start));
while( !q.empty() )
{
pii nod = q.top();
q.pop();
// first = cost, second = vecin
if( dist[nod.second]<inf ) continue;
dist[nod.second] = nod.first;
for(vector<pii >::iterator it=e[nod.second].begin(); it!=e[nod.second].end(); it++)
if( dist[ it->second ]==inf )
q.push(make_pair(it->first + nod.first, it->second));
}
}
int main() {
FILE* fin = fopen(INFILE, "r");
ofstream fout(OUTFILE);
int cases;
fscanf(fin, "%d", &cases);
for(;cases; cases--) {
int m, start;
fscanf(fin, "%d %d %d ", &n, &m, &start);
for(int i=0; i<n; i++)
fscanf(fin, "%d", &d[i]);
e.clear();
e.resize(n);
for(; m; m--) {
int a, b, c;
fscanf(fin, "%d %d %d ", &a, &b, &c);
e[a-1].pb(make_pair(c, b-1));
e[b-1].pb(make_pair(c, a-1));
}
dijkstra(start-1);
bool ok = true;
for(int i=0; i<n && ok; i++)
if( dist[i]!=d[i] )
ok = false;
fout << (ok ? "DA" : "NU");
if( cases>1 ) fout << "\n";
}
return 0;
}