Floyd算法
Floyd算法又称为插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。
注意:由下面的练习可以看出,其实很多题目不是直接问你floyd怎么求最短路径,而是要你利用floyd的动态规划思想解决类似floyd的问题。
Floyd算法可以算边权值非负的最短路径问题。下面给出算法模板
<span style="font-size:18px;">#include<cstdio> using namespace std; #define INF 1e9 const int maxn=100+10; int n,m;//点数,边数,点从0到n-1编号 int dist[maxn][maxn];//记录距离矩阵 int path[maxn][maxn];//path[i][j]=x表示i到j的路径上(除i外)的第一个点是x. void init() { for(int i=0;i<n;i++) for(int j=0;j<n;j++) { dist[i][j] = i==j?0:INF;//其实这里d[i][j]应该还要通过输入读数据的 path[i][j]=j; } //读取其他dist[i][j]的值 } void floyd() { for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(dist[i][k]<INF && dist[k][j]<INF ) { if(dist[i][j]>dist[i][k]+dist[k][j]) { dist[i][j] = dist[i][k]+dist[k][j]; path[i][j] = path[i][k]; } else if(dist[i][j] == dist[i][k]+dist[k][j] &&path[i][j]>path[i][k]) { path[i][j] = path[i][k]; //最终path中存的是字典序最小的路径 } } } int main() { //读n和m init(); //读m条边 floyd(); //输出所求最短路径距离 return 0; } </span>
Floyd算法应用
HDU 1690Bus System(Floyd):简单应用。解题报告!
POJ 2240Arbitrage(Floyd):Floyd的DP思想。解题报告!
HDU 1385Minimum Transport Cost(Floyd+打印字典序最小路径):Floyd变形且输出字典序最小的路径。解题报告!
POJ 2263Heavy Cargo(Floyd变形):floyd变形。解题报告!
POJ 1847Tram(Floyd):动态图求最短路径。解题报告!
POJ 1125Stockbroker Grapevine(Floyd):Floyd简单应用。解题报告!
POJ 3615Cow Hurdles(Folyd变形):最大值中的最小值问题。解题报告!
POJ 3660Cow Contest(Floyd传递闭包):传递闭包问题。解题报告!
POJ 1975Median Weight Bead(Floyd传递闭包):传递闭包。解题报告!
POJ 2570Fiber Network(Floyd传递闭包+状态压缩):状态压缩+传递闭包。解题报告!
HDU 4034Graph(Floyd变形):有向图最短路径的必要边。解题报告!
HDU 3665Seaside(简单Floyd):解题报告!
HDU 2807The Shortest Path(矩阵相乘+Floyd):解题报告!
HDU 1869六度分离(简单Floyd):解题报告!
HDU 1245Saving James Bond(Floyd):简单Floyd,需要做点分析。解题报告!
POJ 2502Subway(Floyd单源最短路):简单应用。解题报告!
原文地址:http://blog.csdn.net/u013480600/article/details/44875105