[图论]继续研究昨天的问题:最短路HDU2544 Floyd算法

来源:互联网 发布:python lua 比较 编辑:程序博客网 时间:2024/05/16 00:28

求解所有两点间最短路的问题叫做任意两点之间的最短路问题,这次试着使用DP来求解任意两点之间的最短路问题。只使用顶点0-k和i,j的情况下,记录i到j的最短路长度为d[k+1][i][j]。k=-1时,认为只使用i和j。所以d[0][i][j]=cost[i][j]。接下来让我们把只使用定点0-k的问题归约到只使用0~k-1的问题上。

只使用0-k时,我们分i到j的最短路正好经过顶点k一次和完全不经过顶点k两种情况来讨论。不经过顶点k的情况下,d[k][i][j]=d[k-1][i][j],通过顶点k的情况下,d[k][i][j]=d[k-1][i][k]+d[k-1][k][j]。合起来,就得到了d[k][i][j] = min(d[k-1][i][j],d[k-1][i][k]+d[k-1][k][j])。这个DP也可以使用同一个数组,不断使用d[i][j]=Min( d[i][j],d[i][k]+d[k][j] )的更新来实现。

这个算法叫做floyd-Warshall算法,可以可以在O|V^3|时间里求得所有两点间的最短路长度。Floyd-Warshall算法可以处理边是负数的情况。而判断图中是否有负圈,只需检查是否存在d[i][i]是负数的顶点i就可以了。

Floyd的算法:

void warshall_floyd( ){  int i,j,k;  for( k=1;k<=n;++k )    for( i=1;i<=n;++i )      for( j=1;j<=n;++j )        d[i][j]=Min( d[i][j],d[i][k]+d[k][j] );}


接下来还是上次的老问题,这次用Floyd作


最短路 HDU2544

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) 
Total Submission(s): 28761    Accepted Submission(s): 12444 

Problem Description

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? 

Input

输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。 
输入保证至少存在1条商店到赛场的路线。 

Output

对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间

Sample Input

2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0

Sample Output
3 2

#include <stdio.h>#define MAX 0x3f3f3f3f#define RANGE 105int d[RANGE][RANGE];int n;int Min( int a,int b ){  return a<b?a:b;}void warshall_floyd( ){  int i,j,k;  for( k=1;k<=n;++k )    for( i=1;i<=n;++i )      for( j=1;j<=n;++j )        d[i][j]=Min( d[i][j],d[i][k]+d[k][j] );}int main(){  int m,A,B,C,i,j;  while( scanf("%d%d",&n,&m) )  {    if( !n && !m )  break;    // 初始化    for( i=1;i<=n;++i )      for( j=1;j<=i;++j )      {        if( i==j ) d[i][j]=0;        else    d[i][j]=d[j][i]=MAX;      }    // 输入    for( i=0;i<m;++i )    {      scanf("%d%d%d",&A,&B,&C);      d[A][B]=d[B][A]=C;    }    // floyd算法求最短路    warshall_floyd();    printf("%d\n",d[1][n]);  }  return 0;}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 薄荷叶叶边干了怎么办 碗莲叶子发黑腐烂怎么办 龟背叶叶子蔫了怎么办 夏天龟背竹蔫了怎么办 春羽叶子长黄斑怎么办 百合竹叶子发黄掉落怎么办 凤尾蕨叶子蔫了怎么办 绿地珊瑚蕨干了怎么办 翠云草叶子蔫了怎么办 珊瑚蕨叶子烂了怎么办 黑骨茶叶子黑斑怎么办 外场主持没有人互动怎么办 企业年报填错了怎么办 手机忘了放哪了怎么办 燃气卡车没气了怎么办 老房子拆了重建怎么办 加了差的汽油怎么办 事业单位未满5年怎么办 小学孩子不会制订学习计划怎么办 忘记提交原创怎么办百度熊掌号 计算机一级报名表填错了怎么办 离婚了不给孩子生活费怎么办 点击爱奇艺系统提示停止运行怎么办 电视机图像颜色变了怎么办 10万签约被拒怎么办 钢琴弹奏中的折指怎么办! 吉他琴头旋钮将琴头扭坏了怎么办? 1岁幼儿不爱吃饭怎么办 3岁幼儿不爱吃饭怎么办 4岁幼儿不爱吃饭怎么办 买票买了点映 怎么办 一年级孩子注意力不集中怎么办 孩子上一年级注意力不集中怎么办 普宁二中初一新生住宿怎么办 小学入学普查错过了怎么办 初一的孩子不爱学习怎么办 初一孩子出现厌学情况怎么办 客人要求我们代办事项时怎么办 客人要求我们代办事项应该怎么办 想家了特别想哭怎么办 把友谊看得太重怎么办