Floyd适用无向图和有向图,不适用于带负权的图
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int n , m;
int a[105][105];
const int inf = 999999;
int main(void)
{
int from , to , val;
scanf("%d %d" , &n , &m);
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 1 ; j <= n ; j ++)
{
if(i == j)
a[i][j] = 0;
else
a[i][j] = inf;
}
}//对图进行初始化
for(int i = 1 ; i <= m ; i ++)
{
scanf("%d %d %d",&from,&to,&val);
a[from][to] = val;
}输入边权值
//floyd核心算法
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];
}
}
}
//输出图(任意两点的最短距离)
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= n ; j ++)
{
printf("%10d",a[i][j]);
}
cout<<endl;
}
}
丢一组测试数据:
4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12