注意重边,多头牛同一位置。 #include <iostream> #include <vector> using namespace std; vector<int> vec; int map[505][505]; //地图 int dis[505]; //保存最短路径的值 int cow[105]; //保存牛在哪个农场 bool visit[505]; //检查该点是否已访问 int f,p,c,m; const int inf=999999999; void dijkastra(){ //dij模板 int min_t,tag; for(int i=1;i<=f;++i){ dis[i]=map[1][i]; visit[i]=false; } visit[1]=true; for(int i=1;i<=f;++i){ min_t=inf; for(int j=1;j<=f;++j) if(!visit[j]&&dis[j]<min_t){ min_t=dis[j]; tag=j; } if(min_t==inf) return ; visit[tag]=true; for(int j=1;j<=f;++j) if(!visit[j]&&map[tag][j]<inf&&dis[tag]+map[tag][j]<dis[j]) dis[j]=dis[tag]+map[tag][j]; } } int main(){ while (cin>>f>>p>>c>>m) { vec.clear(); int a,b,t; for(int i=1;i<=f;++i) for(int j=1;j<=f;++j){ map[i][j] = inf; if(i==j) map[i][j]=0; } for(int i=0;i<p;++i){ cin>>a>>b>>t; if(map[a][b]>t){ map[a][b]=t; map[b][a]=t; } } for(int i=1;i<=c;++i) cin>>cow[i]; //input and initial dijkastra(); for(int i=1;i<=c;++i) //记录可以到达的牛的编号 if(dis[ cow[i] ]<=m) vec.push_back(i); int size=(int)vec.size(); cout<<size<<endl; for(int i=0;i<size;++i) cout<<vec[i]<<endl; } return 0; }