Pagini recente » Cod sursa (job #1980316) | Cod sursa (job #935475) | Cod sursa (job #518193) | Cod sursa (job #1001902) | Cod sursa (job #417454)
Cod sursa(job #417454)
#include <fstream.h>
#define NMax 50001
#define inf 1000000000
int n,m,*A[NMax],*B[NMax],s,T,dB[NMax],d[NMax];
int dijkstra(int nc)
{
int i,j,k,min,util[NMax],ind;
for(i=1;i<=n;i++)
d[i]=inf;
memset(util,0,sizeof(util));
d[nc]=0;
util[nc]=1;
for(i=1;i<n;i++)
{
for(j=1;j<=A[nc][0];j++)
if(!util[A[nc][j]] && d[nc]+B[nc][j]<d[A[nc][j]])
{
d[A[nc][j]]=d[nc]+B[nc][j];
if(d[A[nc][j]]<dB[A[nc][j]]) return 0;
}
j=1;
while(util[j]) j++;
min=d[j];
ind=j;
for(;j<=n;j++) if(min>d[j] && !util[j]) min=d[j],ind=j;
nc=ind;
util[nc]=1;
}
//for(i=1;i<=n;i++) if(d[i]!=dB[i]) return 0;
return 1;
}
void citire()
{
ifstream in("distante.in");
ofstream out("distante.out");
int i,j,x,y,c,p;
in >>T;
for(j=1;j<=T;j++)
{
in >>n>>m>>s;
for(p=1;p<=n;p++) in >>dB[p];
for(i=1;i<=n;i++) A[i]=(int*)realloc(A[i],sizeof(int)),B[i]=(int*)realloc(B[i],sizeof(int)),A[i][0]=0;
for(i=1;i<=m;i++)
{
in >>x>>y>>c;
A[x][0]++;
A[x]=(int*)realloc(A[x],(A[x][0]+1)*sizeof(int));
B[x]=(int*)realloc(B[x],(A[x][0]+1)*sizeof(int));
B[x][A[x][0]]=c;
A[x][A[x][0]]=y;
A[y][0]++;
A[y]=(int*)realloc(A[y],(A[y][0]+1)*sizeof(int));
B[y]=(int*)realloc(B[y],(A[y][0]+1)*sizeof(int));
B[y][A[y][0]]=c;
A[y][A[y][0]]=x;
}
//dijkstra
if(dijkstra(s)) out <<"DA\n";
else out <<"NU\n";
}
out.close();
in.close();
}
int main()
{
citire();
return 0;
}