floyd解决的是多源最短路问题,通过插k点和三层循环遍历更新起止点之间的距离。初始化时将起始都是自身的距离初始化为0,其他都为INF。
#include<stdio.h>
#include<iostream>
#include<limits.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int INF=INT_MAX/100;
int d[3000][3000],n,m;
void floyed()
{
for(int k=0; k<n; k++) //插入k点
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(d[i][k]<INF&&d[k][j]<INF) //消除加法溢出问题
d[i][j]=min(d[i][j],d[i][k]+d[k][j]); //更新两点距离
}
}
}
}
void init()
{
cin>>n>>m;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
if(i==j)
d[i][j]=0;
else
d[i][j]=INF;
}
for(int i=0; i<m; i++)
{
int sta,stb,coc;
cin>>sta>>stb>>coc;
d[sta][stb]=coc;
}
}
int main()
{
init();
floyed();
return 0;
}