Pagini recente » Cod sursa (job #1047787) | Cod sursa (job #2877794) | Cod sursa (job #1877669) | Cod sursa (job #2210987) | Cod sursa (job #140388)
Cod sursa(job #140388)
//1-contoare,
#include <string.h>
#include <stdio.h>
#define INF 32767
#define M 100
#define N 100
struct nod
{unsigned int gnod;
unsigned int gcost;
nod *urm;
};
FILE *fin,*fout;
nod *varf,*mp[N+1];
unsigned int n,m;
unsigned int cost[N+1],flag[N+1],costi[N+1];
void appnod(unsigned int,unsigned int,unsigned int);
void dij(unsigned int gnod)
{nod *pl;
unsigned int i,j,min,imin;
cost[gnod]=0;
for (i=0;i<n-1;i++)
{for (imin=0,min=INF,j=1;j<=n;j++)
{if(flag[j]==0&&min>cost[j])
{min=cost[j];imin=j;
}
}
flag[imin]=1;
for(pl=mp[imin];pl!=NULL;pl=pl->urm)
{if(flag[pl->gnod]==0&&cost[pl->gnod]>cost[imin]+pl->gcost)
{cost[pl->gnod]=cost[imin]+pl->gcost;
}
}
}
}
int compar()
{int i,flag=1;
for (i=1;i<=n;i++)
{if(costi[i]!=cost[i])
{flag=0;break;}
}
if(flag)
{return 1;}
else
return 0;
}
void sterge()
{nod *pl=varf;
while(pl)
{varf=varf->urm;
delete pl;
pl=varf;
}
}
void citire()
{unsigned int i,a,b,c,s;
fscanf(fin,"%d%d%d",&n,&m,&s);
sterge();
for (i=0;i<N+1;i++)
{mp[i]=NULL;}
for (i=1;i<=n;i++)
{fscanf(fin,"%d",&costi[i]);
}
for (i=0;i<m;i++)
{fscanf(fin,"%d%d%d",&a,&b,&c);
appnod(a,b,c);
}
for (i=1;i<=n;i++)
{cost[i]=INF;}
memset(flag,0,sizeof(flag));
dij(s);
if(compar())
fprintf(fout,"DA ");
else
fprintf(fout,"NU ");
}
void appnod(unsigned int a,unsigned int b,unsigned int c)
{nod* p=new nod;
p->gnod=a;
p->gcost=c;
p->urm=mp[b];
mp[b]=p;
p=new nod;
p->gnod=b;
p->gcost=c;
p->urm=mp[a];
mp[a]=p;
}
int main ()
{varf=NULL;
int i,t;
fin=fopen("graf.in","r");
fout=fopen("graf.out","w");
fscanf(fin,"%d",&t);
for (i=0;i<t;i++)
{citire();
}
fclose(fout);
return 0;
}