1.题意:输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个; 接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时,接着的第T+1行有S个数,表示和草儿家相连的城市; 接着的第T+2行有D个数,表示草儿想去地方,求草儿能去某个喜欢的城市的最短时间。
2.思路:类似于最短路径问题,采用spfa算法,不同的是在指定的点中选出,而不是在所有点里
#include <cstdio> #include <cstring> #include <queue> #define INF 1000000000 #define MAX 1010 using namespace std; int map[MAX][MAX],n; int dis[MAX]; bool vin[MAX]; queue<int> q; void spfa() { int j,u; while(!q.empty()) { u=q.front(); q.pop(); vin[u]=0; for(j=1;j<=n;j++) { if(map[u][j]) { int len=dis[u]+map[u][j]; if(dis[j]>len) { dis[j]=len; if(!vin[j]) { q.push(j); vin[j]=1; } } } } } } void Init(int s) { int i,m; memset(vin,0,sizeof(vin)); while(!q.empty()) q.pop(); for(i=0;i<s;i++) { scanf("%d",&m); dis[m]=0; if(!vin[m]) q.push(m); vin[m]=1; } } int main() { int i,t,s,d,a,b,l,m,ans; //freopen("data.txt","r",stdin); while(scanf("%d %d %d",&t,&s,&d)!=EOF) { memset(map,0,sizeof(map)); n=-1; for(i=0;i<t;i++) { scanf("%d %d %d",&a,&b,&l); if(map[a][b]<=0 || map[a][b]>l) map[a][b]=l; if(map[b][a]<=0 || map[b][a]>l) map[b][a]=l; n=a>n ? a : n; n=b>n ? b : n; } for(i=1;i<=n;i++) dis[i]=INF; Init(s); spfa(); ans=INF; for(i=0;i<d;i++) { scanf("%d",&m); ans=dis[m]<ans ? dis[m] : ans; } printf("%d\n",ans); } return 0; }