Pagini recente » Cod sursa (job #1265425) | Cod sursa (job #143115) | Cod sursa (job #1133418) | Cod sursa (job #2604746) | Cod sursa (job #145779)
Cod sursa(job #145779)
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
#define infinit 0x3f3f3f3f
#define pb push_back
#define lg 50005
int n, m, s, rez[lg], cnt[lg], nr[lg], i, j, teste, x, y, cst, nxt;
bool fst[lg];
typedef pair<int, int> graf;
vector<graf> v[lg];
queue<int> q;
void golire(){
for (i = 1; i <= n; i ++){
for (j = 0; j < nr[j]; j ++)
v[i].pop_back();
nr[i] = 0;
}
}
void citire(){
int kkt = 0, j, nt;
char sir[50];
fgets(sir, 50, stdin), nt = 0;
for (j = nt; sir[j] <= '9' && sir[j] >= '0'; j ++)
kkt = kkt*10+sir[j]-'0';
x = kkt, kkt = 0;
nt = j+1;
for (j = nt; sir[j] <= '9' && sir[j] >= '0'; j ++)
kkt = kkt*10+sir[j]-'0';
y = kkt, kkt = 0;
nt = j+1;
for (j = nt; sir[j] <= '9' && sir[j] >= '0'; j ++)
kkt = kkt*10+sir[j]-'0';
cst = kkt;
}
int main()
{
freopen("distante.in", "rt", stdin);
freopen("distante.out", "wt", stdout);
scanf("%d", &teste);
for (int test = 1; test <= teste; test ++){
scanf("%d%d%d", &n, &m, &s);
for (i = 1; i <= n; i ++)
scanf("%d", &rez[i]);
for (i = 1; i <= m; i ++){
citire();
nr[x] ++;
v[x].pb(graf(y, cst));
nr[y] ++;
v[y].pb(graf(x, cst));
}
for (i = 1; i <= n; i ++)
cnt[i] = infinit;
cnt[s] = 0;
q.push(s);
fst[s] = true;
while (!q.empty()){
x = q.front();
q.pop();
for (i = 0; i < nr[x]; i ++){
nxt = v[x][i].first;
cst = v[x][i].second;
if (cnt[x] + cst < cnt[nxt]){
cnt[nxt] = cnt[x] + cst;
if (!fst[nxt]){
q.push(nxt);
fst[nxt] = true;
}
}
}
fst[x] = false;
}
s = 0;
for (i = 1; i <= n; i ++)
if (cnt[i] != rez[i]){
s = 1;
break;
}
if (!s)
printf("DA\n");
else
printf("NU\n");
golire();
}
return 0;
}