Floyd算法

来源:互联网 发布:矩阵的奇异值定义 编辑:程序博客网 时间:2024/06/06 00:57
参考:http://www.cnblogs.com/twjcnblog/archive/2011/09/07/2170306.html
参考:http://www.cnblogs.com/dolphin0520/archive/2011/08/27/2155542.html
Floyd算法用于求有向图中任意两点间的最短路径问题。主要需要的参数为图的邻接矩阵。
基本思想:

任意一点i到j的最短路径有两种可能:1、i直接到j;2、i经过若干其他节点到j。
初始时,假设Vi到Vj的弧是他们之间的最短路径(若不存在弧则置弧度权值为∞),然后进行n此试探。首先考虑路径Vi,V0,Vj,比较Vi,Vj和Vi,V0,Vj的长度,取较短者作为Vi到Vj的中间节点序号不大于0的最短路径。然后在路径上增加一个顶点V1,若Vi……V1和V1……Vj分别是当前找到的中间节点序号不大于0的最短路径,那么Vi……V1……Vj就有可能是Vi……Vj中间节点序号不大于1的最短路径。将它和已经得到的从Vi到Vj的中间节点序号不大于0的路径比较,取较短者作为Vi到Vj中间节点序号不大于1的最短路径,一次类推,进行n此比较后,求得Vi到Vj的最短路径。

Floyd算法的核心是三个for循环,主要注意的是三个循环的次序不要搞错。

/*************************************************************************    > File Name: Floyd.cpp    > Author: Shorey    > Mail: shoreybupt@gmail.com    > Created Time: 2015年04月26日 星期日 12时05分45秒 ************************************************************************/#include<iostream>#include<stdlib.h>#include<stdio.h>#include<stack>#define M 100#define N 100#define INT_MAX 10000using namespace std;struct MGraph{int matrix[N][M];int n,e;};void Floyd(MGraph g, int dist[N][M], int path[N][M]){for(int i=0; i<g.n; i++){for(int j=0; j<g.n; j++){if(g.matrix[i][j]>0)//初始化工作{dist[i][j] = g.matrix[i][j];path[i][j] = i;}else{if(i!=j){dist[i][j] = INT_MAX;     //没有路径的两点的距离设置为无穷大path[i][j] = -1;          //前驱结点设置为-1}else{dist[i][j] = 0;          //顶点和自己为直连path[i][j] = i;}}}}for(int k=0; k<g.n; k++)        //主要算法for(int i=0; i<g.n; i++)for(int j=0; j<g.n; j++){if(dist[i][k]+dist[k][j]<dist[i][j]){dist[i][j] = dist[i][k]+dist[k][j];path[i][j] = path[k][j];}}}void showPath(int path[N][M], int s, int t){stack<int> st;int v = t;while(t!=s){st.push(t);t=path[s][t];}st.push(t);while(!st.empty()){printf("%d ",st.top());st.pop();}}int main(){int e,n;MGraph g;int dist[N][M],path[N][M];while(scanf("%d%d",&n,&e)&&e!=0){int s,t,w;//MGraph g;//int dist[N][M],path[N][M];g.n = n;g.e = e;for(int i=0; i<g.n; i++)for(int j=0; j<g.n; j++)g.matrix[i][j] = 0;for(int i=0; i<g.e; i++){scanf("%d%d%d",&s,&t,&w);g.matrix[s][t] = w;}Floyd(g, dist, path);for(int i=0; i<g.n; i++)for(int j=0; j<g.n; j++){if(dist[i][j]>0){showPath(path,i,j);printf("%d\n",dist[i][j]);}}}return 0;}


0 0
原创粉丝点击