Floyd算法 求任意两点的最短路
2014-08-05 11:45
309 查看
Floyd算法用来解决每对顶点间的最短路径问题,时间复杂度为V^3(V为节点数)。算法用到dp的思想:
d[i][j](k) = min(d[i][j](k-1),d[i][k](k-1) + d[k][j](k-1));
其中d[i][j](k)表示从顶点i到顶点j的路径中,所有中间顶点的序号不大于k(即属于{1,2,3,,,,k}这个集合)的一条最短路径权值;
当k == 0 是,d[i][j](k) = 边(i,j)的权值;
令(vi,,,,,vk)为vi到vk的中间路径中顶点序号不大于k-1的最短路径,(vk,,,,,,,vj)为vk到vj的中间路径中顶点序号不大于k-1的最短路;
则将(vi,,,,,,vk,,,,,,vj)与原有的从vi到vj的中间路径中顶点序号不大于k-1的最短路相比较,其长度便是从vi到vj的中间顶点序号不大于k的最短路径。
这样经过n次比较后可以得到每对顶点间的最短路径;
poj3660 Floyd模板题目;
d[i][j](k) = min(d[i][j](k-1),d[i][k](k-1) + d[k][j](k-1));
其中d[i][j](k)表示从顶点i到顶点j的路径中,所有中间顶点的序号不大于k(即属于{1,2,3,,,,k}这个集合)的一条最短路径权值;
当k == 0 是,d[i][j](k) = 边(i,j)的权值;
令(vi,,,,,vk)为vi到vk的中间路径中顶点序号不大于k-1的最短路径,(vk,,,,,,,vj)为vk到vj的中间路径中顶点序号不大于k-1的最短路;
则将(vi,,,,,,vk,,,,,,vj)与原有的从vi到vj的中间路径中顶点序号不大于k-1的最短路相比较,其长度便是从vi到vj的中间顶点序号不大于k的最短路径。
这样经过n次比较后可以得到每对顶点间的最短路径;
poj3660 Floyd模板题目;
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<climits> #include<cctype> #include<iostream> #include<algorithm> #include<queue> #include<vector> #include<map> #include<set> #include<stack> #include<string> #define ll long long #define INF INT_MAX #define eps 1e-8 #define MAX 110 using namespace std; bool a[MAX][MAX]; int n; void floyd(){ for (int k=0; k<n; k++){ for (int i=0; i<n; i++) for (int j=0; j<n; j++) a[i][j] = a[i][j] || (a[i][k] && a[k][j]); } } int main(){ int m; while (scanf("%d%d",&n,&m) != EOF){ int u,v; memset(a,false,sizeof(a)); for (int i=0; i<m; i++){ scanf("%d%d",&u,&v); u--; v--; a[u][v] = true; } floyd(); int ans = 0,cnt = 0; for (int i = 0; i<n; i++){ int cnt = 0; for (int j = 0; j<n; j++){ if (a[i][j] || a[j][i]) cnt++; } if (cnt == n-1) ans++; } printf("%d\n",ans); } return 0; }
相关文章推荐
- floyd算法-求图中任意两点间最短路
- hdu 4460 求所有任意两点间的最短路
- poj 1125 Floyd算法求任意两点间的最短路
- 马踏棋盘3--求任意两点之间最短路
- [fzu 2271]不改变任意两点最短路至多删的边数
- 迷宫--矩阵中任意两点之间最短路-4个方向(dfs)
- UVa 10803 Thunder Mountain (任意两点最短路的最大值+Floyd)
- POJ 1125 Stockbroker Grapevine(任意两点的最短路,FLoyed 算法)
- 运用Floyd算法求得带权有向图任意两点间的最短路径C/C++
- 迷宫2--矩阵中任意两点最短路(8个方向) dfs 效率很低
- POJ 2139-- 最短路径 (floyd算法,任意两点间的最短路径)
- 任意两点间的最短路问题(floyd算法)
- Cow Contest(POJ 3660)(Floyd)(任意两点间最短路)
- ACM模板 图论,Floyd 任意两点间最短路
- AOJ -0189 Convenient Location && poj 2139 Six Degrees of Cowvin Bacon (floyed求任意两点间的最短路)
- Floyd-Warshall算法(求解任意两点间的最短路) 详解 + 变形 之 poj 2253 Frogger
- Floyd算法(任意两点间的最短路径)
- Floyd-Warshall算法求任意两点间的最短路(图论算法)
- floyd 任意两点最短路
- warshall-floyd算法:POJ No 2139 Six Degress of Cowvin Bacon(任意两点最短路径))