标签:
本题链接:点击打开链接
本题大意:
输入T.S.D,代表有T组数据,有S个起点,D个终点,每组数据输入两个点及权值。求从任意起点到任意终点中,求消耗时间最短的旅行时间。
解题思路:
此题也是求最短路径问题,关键是此题有多个起点,多个终点。一个较好的求法是另外添加一个点(保证此点与所给点无冲突即可),将此点到各起点的距离均记作0,则就简化成了一个起点,多个终点。使用迪科斯彻算法求出来各个终点到此起点的最短距离,然后再比较其值,取最小的即可。
参考代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f int map[1010][1010]; int mark[1010]; int dis[1010]; int n,m; void dijkstra()//dijkstra算法,求出终点到起点的最短路径 { memset(mark,0,sizeof(mark)); for(int i=1;i<=n;i++) dis[i]=map[0][i]; dis[0]=0; for(int i=0;i<n;i++) { int vir,min=INF; for(int j=1;j<=n;j++) { if(!mark[j]&&dis[j]<min) { min=dis[j]; vir=j; } } if(min==INF) break; mark[vir]=1; for(int j=1;j<=n;j++) if(!mark[j]&&dis[j]>dis[vir]+map[vir][j]) dis[j]=dis[vir]+map[vir][j]; } } int main() { int t,s,d,start,end; int a,b,time; while(scanf("%d%d%d",&t,&s,&d)!=EOF) { n=0,m=INF; for(int i=0;i<1010;i++) for(int j=0;j<1010;j++) map[i][j]=INF; for(int i=0;i<t;i++) { scanf("%d%d%d",&a,&b,&time); if(map[a][b]>time) { map[a][b]=time; map[b][a]=time; n=max(max(a,b),n);//因为不知道编号的范围,故需求出最大编号 } } for(int i=0;i<s;i++)//另外选取0作为起点,将各起点距此距离设为0 { scanf("%d",&start); map[0][start]=0; map[start][0]=0; } dijkstra(); for(int i=0;i<d;i++)//选取各终点中最小的 { scanf("%d",&end); m=min(m,dis[end]); } printf("%d\n",m); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/lsgbb/article/details/47731805