博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最短路径算法----floyd(转)
阅读量:4921 次
发布时间:2019-06-11

本文共 1728 字,大约阅读时间需要 5 分钟。

一.Floyd算法

  假设从i到j的最短路径上要经过若干个顶点,这些中间顶点中最大的顶点编号为k,最小的顶点为t,因此要求算dist[i][j]的最小值,那么只需要求算dist[i][s]+dist[s][j](t<=s<=k)的所有值,并取其中最小者即可。因此可以设置一个中间顶点k(0<=k<n)分别插入到每队顶点(i,j)之中,并更新dist[i][j]的值。当n个顶点插入到每队顶点之中,求解便结束了。其实Floyd算法实质上是一个动态规划算法。

1 /*每对顶点之间最短路径Floyd 2011.8.27*/   2   3 #include 
4 #include
5 #define M 100 6 #define N 100 7 using namespace std; 8 9 typedef struct node 10 { 11 int matrix[N][M]; //邻接矩阵 12 int n; //顶点数 13 int e; //边数 14 }MGraph; 15 16 void FloydPath(MGraph g,int dist[N][M],int path[N][M]) 17 { 18 int i,j,k; 19 for(i=0;i
0) 23 { 24 dist[i][j]=g.matrix[i][j]; 25 path[i][j]=i; 26 } 27 else 28 { 29 if(i!=j) 30 { 31 dist[i][j]=INT_MAX; 32 path[i][j]=-1; 33 } 34 else 35 { 36 dist[i][j]=0; 37 path[i][j]=i; 38 } 39 } 40 } 41 for(k=0;k
0&&dist[i][k]
0&&dist[k][j]
st; 58 int v=t; 59 while(t!=s) 60 { 61 st.push(t); 62 t=path[s][t]; 63 } 64 st.push(t); 65 while(!st.empty()) 66 { 67 cout<
<<" "; 68 st.pop(); 69 } 70 71 } 72 73 int main(int argc, char *argv[]) 74 { 75 int e,n; 76 while(cin>>e>>n&&e!=0) 77 { 78 int i,j; 79 int s,t,w; 80 MGraph g; 81 int dist[N][M],path[N][M]; 82 g.n=n; 83 g.e=e; 84 for(i=0;i
>s>>t>>w; 90 g.matrix[s][t]=w; 91 } 92 FloydPath(g,dist,path); 93 for(i=0;i
0&&dist[i][j]

(转)

 

转载于:https://www.cnblogs.com/WayneZeng/archive/2012/10/23/2736173.html

你可能感兴趣的文章
C#基础拾遗系列之一:先看懂IL代码
查看>>
图上的文章(割点和桥)
查看>>
luogu1092虫食算(未AC,待续中~~~)
查看>>
Ghostscript 中 ps2pdf 命令在 windows msys 下的运行错误问题。
查看>>
cf 613E - Puzzle Lover
查看>>
SQL Server--导入和导出向导
查看>>
python 数据类型
查看>>
05-linux文件属性-硬链接-时间戳
查看>>
2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15)
查看>>
malloc 实现二维数组
查看>>
P2661 信息传递
查看>>
[HDU] 1025 Constructing Roads In JGShining's Kingdom - 二分的求最大递增非连续子序列
查看>>
decode函数
查看>>
SCP注意事项
查看>>
英国NHS
查看>>
ScrollView嵌套GridView和ListView行高问题
查看>>
测试秒杀新版本3.5 stieserver cms
查看>>
Lua获取当前时间
查看>>
redis5.0主从配置
查看>>
JavaScript严谨模式(Strict Mode)提升开发效率和质量
查看>>