Pagini recente » Monitorul de evaluare | Cod sursa (job #617851) | Cod sursa (job #1695879) | Cod sursa (job #3261314) | Cod sursa (job #17924)
Cod sursa(job #17924)
#include <stdio.h>
#define NMAX 50032
#define INF "distante.in"
#define OUF "distante.out"
int cost[NMAX],bit[NMAX],t,n,m,source;
struct nod
{
int x,cost;
nod *next;
};
struct lst
{
nod *p,*q;
void init()
{
p=q=NULL;
}
void insert(int nd,int val)
{
nod *op;
op=new nod;
op->x=nd;op->cost=val;
if(p==NULL) p=q=op;
else
{
q->next=op;
q=op;
}
}
}list[NMAX];
void delete_list(nod *op)
{
if(op!=NULL)
{
delete_list(op->next);
delete op;
}
}
int main()
{
int k,i,a,b,c,ok,min,val;
FILE *in,*out;
nod *op,*mn;
in=fopen(INF,"r");
out=fopen(OUF,"w");
fscanf(in,"%d",&t);
for(k=1;k<=t;k++)
{
ok=1;
fscanf(in,"%d %d %d",&n,&m,&source);
for(i=1;i<=n;i++)
{
fscanf(in,"%d",cost+i);
list[i].init();
}
for(i=1;i<=m;i++)
{
fscanf(in,"%d %d %d",&a,&b,&c);
list[a].insert(b,c);
list[b].insert(a,c);
}
if(cost[source]!=0) ok=0;
else
{
for(i=1;i<=n&&ok;i++)
if(i!=source)
{
min=(1<<30);
op=list[i].p;mn=NULL;
while(op!=NULL)
{
val=cost[op->x]+op->cost;
if((val)<min&&op->x!=i){ min=val;mn=op;}
op=op->next;
}
if(cost[i]!=min) ok=0;//printf("%d\n",i);}
}
op=list[source].p;min=(1<<30);mn=NULL;
while(op!=NULL)
{
if(op->cost<min){mn=op;min=op->cost;}
op=op->next;
}
if(min!=cost[mn->x]) ok=0;
}
for(i=1;i<=n;i++) delete_list(list[i].p);
if(ok) fprintf(out,"DA\n");
else fprintf(out,"NU\n");
}
fclose(in);fclose(out);
return 0;
}