呃。。。帮别人改的代码。。。顺便就过了。。
风格不是我的。。
#include <stdio.h>
#include <string.h>
#define MAX 1000000000
#define MAXN 1010
int f,p,c,m,toil=1;
int pnt[MAXN*MAXN],next[MAXN*MAXN],head[MAXN*MAXN],len[MAXN*MAXN];
int cow[MAXN],dist[MAXN],used[MAXN];
int count,min,minp;
void addedge(int u,int v,int w)
{
pnt[toil]=v;
len[toil]=w;
next[toil]=head[u];
head[u]=toil++;
}
void dijstra(int s)
{
int i,j;
memset(used,0,sizeof(used));
for(i=1;i<=f;i++)
{
dist[i]=MAX;
}
dist[s]=0;
for(i=1;i<=f;i++)
{
min=MAX;minp=-1;
for(j=1;j<=f;j++)
{
if(!used[j]&&min>dist[j])
{
min=dist[j];
minp=j;
}
}
used[minp]=1;
if(minp==-1) break;
int idx=head[minp];
while(idx!=-1)
{
if(!used[pnt[idx]] && dist[minp]+len[idx]<dist[pnt[idx]])
dist[pnt[idx]]=dist[minp]+len[idx];
idx=next[idx];
}
}
}
int main()
{
int i,u,v,w;
count=0;
memset(next,-1,sizeof(next));
memset(head,-1,sizeof(head));
scanf("%d%d%d%d",&f,&p,&c,&m);
for(i=1;i<=p;i++)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
for(i=1;i<=c;i++)
scanf("%d",&cow[i]);
dijstra(1);
for(i=1;i<=c;i++)
{
if(dist[cow[i]]<=m)
count++;
}
printf("%d\n",count);
for(i=1;i<=c;i++)
{
if(dist[cow[i]]<=m)
printf("%d\n",i);
}
return 0;
}
浙公网安备 33010602011771号