Pagini recente » Cod sursa (job #1247750) | Cod sursa (job #2049808) | Cod sursa (job #2562900) | Cod sursa (job #2265541) | Cod sursa (job #794713)
Cod sursa(job #794713)
#include <vector>
#include <fstream>
#include <queue>
using namespace std;
#define INFILE "distante.in"
#define OUTFILE "distante.out"
#define pb push_back
#define piii pair<int,pair<int,int>>
#define NMAX 50010
#define inf 50000000
vector< piii > e;
int n, dist[NMAX], d[NMAX];
void bellman_ford(int start) {
for(int i=0; i<n; i++)
dist[i] = inf;
dist[start] = 0;
bool changed = true;
for(int i=0; i<n-1 && changed; i++)
{
changed = 0;
for(vector<piii >::iterator it = e.begin(); it!=e.end(); it++) {
int a = it->second.first;
int b = it->second.second;
if( dist[a] + it->first < dist[b] )
dist[b] = dist[a] + it->first, changed = 1;
if( dist[b] + it->first < dist[a] )
dist[a] = dist[b] + it->first, changed = 1;
}
}
}
int main() {
ifstream fin(INFILE);
ofstream fout(OUTFILE);
int cases;
fin >> cases;
for(;cases; cases--) {
int m, start;
fin >> n >> m >> start;
for(int i=0; i<n; i++)
fin >> d[i];
e.clear();
for(; m; m--) {
int a, b, c;
fin >> a >> b >> c;
e.pb(make_pair(c, make_pair(a-1, b-1)));
}
bellman_ford(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;
}