hdu 2066 一个人的旅行

来源:互联网 发布:绵阳广播电视网络 编辑:程序博客网 时间:2024/06/04 19:13

本题链接:点击打开链接

本题大意:

        输入T.S.D,代表有T组数据,有S个起点,D个终点,每组数据输入两个点及权值。求从任意起点到任意终点中,求消耗时间最短的旅行时间。

解题思路:

        此题也是求最短路径问题,关键是此题有多个起点,多个终点。一个较好的求法是另外添加一个点(保证此点与所给点无冲突即可),将此点到各起点的距离均记作0,则就简化成了一个起点,多个终点。使用迪科斯彻算法求出来各个终点到此起点的最短距离,然后再比较其值,取最小的即可。

参考代码:

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define INF 0x3f3f3f3fint 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;}


 

0 0
原创粉丝点击