Floyd 算法(模板)
第一次写博客,就把我的第一篇博客
贡献给图论吧哈哈哈哈
今天正在寒假集训,正好讲了几种最短路径算法,今天晚上我就归纳一下并贴出模板,如果有时间我会贴出题的
Floyd
该算法由Robert W.Floyd于1962年发表在Communications of the ACM上。
#include <iostream>
#include <cstdio>
#define INF 6666666
using namespace std;
int a[1000][1000],t1,t2,t3;
int n,m;
int main()
{
scanf("%d%d",&n,&m);//输入点数和路径数
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
a[i][j]=i==j?0:INF;//初始化数组a
for(int i=1;i<=m;++i)
{
scanf("%d%d%d",&t1,&t2,&t3);//输入数据
a[t1][t2]=t3;
}
//算法关键部分,外层循环枚举中转站
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j];
//主要方法:引入另一个点c,尝试会不会使a->c->b的长度小于a->b
//时间复杂度O(N^3),可以解决负权,可以处理负权边
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
cout<<a[i][j]<<" ";
cout<<endl;
}
//输出说明:输出每个点到图中任意一点的距离
return 0;
}
我的QQ:1206668472
---------------------------------------------END---------------------------------------------------