呃。。。帮别人改的代码。。。顺便就过了。。
风格不是我的。。
#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; }