Pagini recente » Cod sursa (job #104608) | Cod sursa (job #3189911) | Cod sursa (job #594221) | Cod sursa (job #3240054) | Cod sursa (job #2651028)
#include <stdio.h>
using namespace std;
#define NMAX 50000
#define INF 1e9
#include <vector>
#include <queue>
struct edge{
int to;
long long cost;
bool operator < (const edge &a) const {
return (cost > a.cost);
}
};
vector <edge> g[NMAX+1];
priority_queue <edge> q;
long long dist[NMAX+1],dist2[NMAX+1];
void dijkstra(int n,int nod){
int i;
for(i=1;i<=n;i++){
dist[i]=INF;
}
for(auto next : g[nod]){
q.push({next.to,next.cost});
}
dist[nod]=0;
while(!q.empty()){
edge next=q.top(); ///iau primul elem din coada
q.pop();
if(dist[next.to]==INF){ ///nu a fost parcurs nodul
dist[next.to]=next.cost;
for(auto elem : g[next.to]){
q.push({elem.to,dist[next.to]+elem.cost});
}
}
}
}
int main()
{
FILE *fin,*fout;
fin=fopen("distante.in","r");
fout=fopen("distante.out","w");
int T,n,m,sursa,x,y,z,i,j,OK;
fscanf(fin,"%d",&T);
for(i=1;i<=T;i++){
OK=0;
fscanf(fin,"%d%d%d",&n,&m,&sursa);
for(j=1;j<=n;j++){
fscanf(fin,"%d",&dist2[j]);
}
for(j=1;j<=m;j++){
fscanf(fin,"%d%d%d",&x,&y,&z);
g[x].push_back({y,z});
g[y].push_back({x,z});
}
dijkstra(n,sursa);
for(j=1;j<=n;j++){
if(dist[j]!=dist2[j])
OK=1;
}
if(OK==0)
fprintf(fout,"DA\n");
else
fprintf(fout,"NU\n");
}
fclose(fin);
fclose(fout);
return 0;
}