Pagini recente » Cod sursa (job #2203641) | Cod sursa (job #2618777) | Cod sursa (job #1991816) | Cod sursa (job #3131560) | Cod sursa (job #3227462)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <fstream>
#include <iostream>
#include <queue>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
void calc_graf() {
int N, M, F;
int a,b,d;
fin >> N >> M >> F;
vector<int> didate;
vector<int> dicalc;
vector<int> adj[5000],dimuchii;
//initializare
for (int i = 0; i <= N; i++ ) {
didate.push_back(0);
dicalc.push_back(9999999);
}
for (int i = 1; i <= N; i++ ) {
fin >> didate[i];
}
for (int i = 0; i < M; i++ ) {
fin >> a >> b >> d;
adj[2 * a].push_back(b);
adj[2 * a + 1].push_back(d);
adj[2 * b].push_back(a);
adj[2 * b + 1].push_back(d);
dimuchii.push_back(d);
}
queue<int> q;
int di, node, vecin, diplu;
q.push(F);
q.push(0);
dicalc[F] = 0;
while(!q.empty()){
node = q.front();
q.pop();
di = q.front();
q.pop();
// fout<<endl;
//adaug vecini in coada
for (int i = 0; i < size(adj[node * 2 ]); i++ ) {
i = i;
vecin = adj[2 * node][i];
//distanta pana la vecin
diplu = adj[2 * node + 1][i];
// cout << node << " " << vecin << endl;
//am gasit un drum/drum mai scurt
if( di + diplu < dicalc[vecin] ) {
dicalc[vecin] = di + diplu;
q.push(vecin);
q.push(di + diplu);
}
// fout << vecin << " ";
}
// fout << adj[ 2 * node][0] << " "<< adj[2 * node+1][0];
// fout<<endl;
}
int ok = 1;
for (int i = 1; i <= N; i++ ) {
if( didate[i] != dicalc[i ]) ok = 0;
}
if(ok) fout << "DA" << endl;
else fout << "NU" << endl;
// for (int i = 1; i <= N; i++ ) {
// fout << didate[i] << " ";
// }fout<<endl;
// for (int i = 1; i <= N; i++ ) {
// fout << dicalc[i] << " ";
// }
}
int main() {
int n;
fin >> n;
for(int i = 1; i <= n; i++) {
calc_graf();
}
return 0;
}