Pagini recente » Cod sursa (job #2765048) | Cod sursa (job #422435) | Cod sursa (job #1096956) | Cod sursa (job #2413871) | Cod sursa (job #1826990)
#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> C[MAX];
void initC(){
int i, j;
for (i=0; i<N; i++){
C[i].clear();
for (j=0; j<N; j++)
C[i].push_back(INF);
}
}
void initR(){
int i;
for (i=0; i<N; i++){
used[i]=false;
Di[i]=C[i][S];
}
}
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--;
C[j][k]=C[k][j]=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<N; j++)
if (Di[j]>Di[k]+C[k][j])
Di[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;
}