Pagini recente » Cod sursa (job #1339888) | Cod sursa (job #2988501) | Cod sursa (job #948211) | Cod sursa (job #786466) | Cod sursa (job #2197126)
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define MAXN 50001
#define MAXM 100001
using namespace std;
set<pair<int,int> > s;
vector <pair<int, int> > g[MAXM];
int d[MAXN], d1[MAXN];
int n;
void dijkstra(int start){
int u, v, costu, costv, i;
for(i=1;i<=n;i++)
d[i]=INF;
d[start]=0;
s.insert(make_pair(0,start));
while(!s.empty()){
u=s.begin()->second;
costu=s.begin()->first;
// printf("%d", u);
s.erase(s.begin());
for(i=0;i<g[u].size();i++){
// printf("DA");
v=g[u][i].second;
costv=g[u][i].first;
if(d[v]>d[u]+costv){
if(d[v]!=INF)
s.erase(s.find(make_pair(d[v],v)));
d[v]=d[u]+costv;
s.insert(make_pair(d[v],v));
}
}
}
}
int main(){
FILE*fin=fopen("distante.in", "r");
FILE*fout=fopen("distante.out", "w");
int i, t, ok, m, start, a, b, c;
fscanf(fin, "%d", &t);
while(t>0){
fscanf(fin, "%d%d%d", &n, &m, &start);
// printf("DA");
for(i=1; i<=n; i++)
fscanf(fin, "%d", &d1[i]);
for(i=1;i<=m;i++){
fscanf(fin, "%d%d%d",&a, &b, &c);
g[a].push_back(make_pair(c, b));
g[b].push_back(make_pair(c, a));
}
dijkstra(start);
for(i=1; i<=n; i++)
g[i].clear();
// printf("DA");
for(i=1; i<=n; i++)
if(d[i]==INF)
d[i]=0;
ok=1;
for(i=1;i<=n;i++)
if(d[i]!=d1[i])
ok=0;
if(ok==1)
fprintf(fout, "DA\n");
else
fprintf(fout, "NU\n");
t--;
}
return 0;
}