这个是按Usaco 2005改的(你们老师偷懒了)题目有点小难度,你若真心要学习C语言,不建议直接参考别人的程序(最终你无论是考试还是比赛终要靠自己完成的),以下是我按网上C++改为C的,你参考下#include<stdio.h>#include <string.h>////Usaco2005int dist[1001][1001];int ans[1001];int min(int a,int b){ return (a<b)?a:b;}int main(){ int i,j,k,x,y,z; int n,m,c,t,len; memset(dist,127/3,sizeof(dist)); for (i=1; i<=n; i++)dist[i][i]=0; scanf("%d%d%d%d",&n,&m,&c,&t); for( i=1; i<=m; i++) { scanf("%d%d%d",&x,&y,&z); if (z<=t) { dist[x][y]=min(dist[x][y],z); dist[y][x]=dist[x][y]; } } for ( k=1; k<=n; k++) for ( i=1; i<=n; i++) for ( j=1; j<=n; j++) if (i!=j) if (dist[i][k]+dist[k][j]<dist[i][j]) dist[i][j]=dist[i][k]+dist[k][j]; for ( i=1; i<=c; i++) { scanf("%d",&x); if (dist[x][1]>t) continue; ans[++len]=i; } for ( i=1; i<len; i++) for ( j=i+1; j<=len; j++) if(ans[i]>ans[j]) { t=ans[i]; ans[i]=ans[j]; ans[j]=t; } printf("%d\n",len); for ( i=1; i<=len; i++) printf("%d\n",ans[i]); return 0;}