Floyed算法求最短路径
——HM
Floyed是一个最短路径问题的一种较为简单的算法,既然简单,缺点就很多,如存储方式只能用二维邻接矩阵来完成,时间复杂度太高(O(n^3))等等问题,竞赛中用的并不是很多,但其思维有用,并且当数据较水是可以适当的骗骗分,大多数情况下是挺有用的。
首先要先了解邻接矩阵这一存图方式:其实这种方式竞赛中并不常用,因为它的占空间极大,是n^2级别,但也有优点,如深搜较快,存图全面等。大体思路就是动态规划的思想,尽管时间复杂度和空间复杂度都与跑n遍Dijkstra差不多,但其简短易写,有时能起到较好的骗分效果。
建图时将两个节点直接相连的两个点赋其权值,不直接相通的两个点赋“无限大”,操作时,将两个点之间建设跳板(第三个点),看它们之间是否存在更短路径并进行替换。
如两点A、B权值为3,A、C权值为10,B、C权值为4,则W[A,B]+W[B,C]<W[A,C],所以将A、C两点之间权值赋成3+4=7代替掉较大的10。
附代码:
#include <iostream>
#define now ga[i][k]+ga[k][j]
using namespace std;
const int SIZE=1005;
int ga[SIZE][SIZE];
int main()
{
int n,e,w,sta,end;
cin>>n>>e;
for (int i=1;i<=e;i++){
int x,y;
cin>>x>>y>>w;
ga[x][y]=ga[y][x]=w;
}
cin>>sta>>end;
for (int k=1;k<=n;k++)
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++){
if (i==j || i==k || k==j) continue;
if (now<ga[i][j])//now为跳板,上面宏定义过
ga[i][j]=now;
}
cout<<ga[sta][end]<<endl<<endl;
/*for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++)
cout<<ga[i][j]<<' ';
cout<<endl;
} 打印操作后的图 */
return 0;
}