最短路问题,,求三点之间的最短路
给出n个电话连接在m个transfer stations上,给出transfer stations之间的距离,
给出三个电话,求把三个电话连通的最短距离
dijkstra可以求出一点到其余个点的最短距离,
枚举所有点到这三个点的最小距离之和,取最小值即可
#include<stdio.h> #include<string.h> #define inf 99999999 int n,m,map[510][510],vis[510],point[10010],dis[510][510],mark[510]; void dijkstra(int s) { int i,j; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) dis[s][i]=inf; dis[s][s]=0; for(i=1;i<=n;i++) { int min=inf,k=-1; for(j=1;j<=n;j++) if(!vis[j]&&min>dis[s][j]) k=j,min=dis[s][j]; if(k==-1)break; vis[k]=1; for(j=1;j<=n;j++) if(!vis[j]&&dis[s][j]>dis[s][k]+map[k][j]) dis[s][j]=dis[s][k]+map[k][j]; } } int main() { int i,j,k,p,x,y,w,t,op=1; while(scanf("%d%d%d",&k,&n,&m)!=-1) { memset(mark,0,sizeof(mark)); for(i=1;i<=n;i++) { map[i][i]=0; for(j=i+1;j<=n;j++) map[i][j]=map[j][i]=inf; } for(i=1;i<=k;i++) scanf("%d",&point[i]); for(i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&w); if(map[x][y]>w) map[x][y]=map[y][x]=w; } printf("Case #%d\n",op++); scanf("%d",&p); t=1; while(p--) { scanf("%d%d%d",&x,&y,&w); x=point[x]; y=point[y]; w=point[w]; if(!mark[x])mark[x]=1,dijkstra(x); if(!mark[y])mark[y]=1,dijkstra(y); if(!mark[w])mark[w]=1,dijkstra(w); int min=inf; for(i=1;i<=n;i++) if(dis[x][i]+dis[y][i]+dis[w][i]<min) min=dis[x][i]+dis[y][i]+dis[w][i]; printf("Line %d: ",t++); if(min<inf) printf("The minimum cost for this line is %d.\n",min); else printf("Impossible to connect!\n"); } } return 0; }