Pagini recente » Cod sursa (job #2306233) | Cod sursa (job #2438623) | Cod sursa (job #935978) | Cod sursa (job #3276333) | Cod sursa (job #1826998)
#include <vector>
#include <fstream>
#define MAX 50000
#define INF 2000000000
using namespace std;
int T, N, M, S, D[MAX], Di[MAX];
bool used[MAX];
vector <int> Node[MAX], C[MAX];
void initC(){
int i;
for (i=0; i<N; i++){
Node[i].clear();
C[i].clear();
}
}
void initR(){
int i;
for (i=0; i<N; i++){
used[i]=false;
Di[i]=INF;
}
for (i=0; i<Node[S].size(); i++)
Di[Node[S][i]]=C[S][i];
}
int main(){
int i, j, k, x, dist;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
fin >> T;
for (x=0; x<T; x++){
fin >> N >> M >> S; S--;
for (i=0; i<N; i++)
fin >> D[i];
initC();
for (i=0; i<M; i++){
fin >> j >> k >> dist;
j--; k--;
Node[j].push_back(k); Node[k].push_back(j);
C[j].push_back(dist); C[k].push_back(dist);
}
initR();
used[S]=true;
Di[S]=0;
for (i=0; i<N-1; i++){
dist=INF;
for (j=0; j<N; j++)
if (used[j]==false && Di[j]<dist){
dist=Di[j];
k=j;
}
used[k]=true;
for (j=0; j<Node[k].size(); j++)
if (Di[Node[k][j]]>Di[k]+C[k][j])
Di[Node[k][j]]=Di[k]+C[k][j];
}
i=0;
while (i<N && Di[i]==D[i])
i++;
if (i==N)
fout << "DA\n";
else
fout << "NU\n";
}
fin.close();
fout.close();
return 0;
}