一、注意点
不能将外层k循环放置内层
二、模板
const int INF=100000000;
const int MAXV =200;//MAXV最大顶点数
int n,m;//n为顶点数,m为边数
int dis[MAXV][MAXV];//dis[i][j]表示顶点i和顶点j的最短距离
void Floyd()
{
for(int k=0;k<n;k++)//遍历每一个点作为中介点
{
for(int i=0;i<n;i++)//遍历每一个点作为一个端点
{
for(int j=0;j<n;j++)//遍历每一个点作为一个端点
{
//如果最短距离不是无穷大,正反皆如此,且以k为中介,可以得到更短的路径
if(dis[i][k]!=INF&&dis[k][j]!=INF&&dis[i][k]+dis[k][j]<dis[i][j])
{
dis[i][j]=dis[i][k]+dis[k][j];//得到更短路径
}
}
}
}
}
int main()
{
int u,v,w;
fill(dis[0],dis[0]+MAXV*MAXV,INF);//dis数组赋初值
scanf("%d%d",&n,&m);//顶点数n、边数m
for(int i=0;i<n;i++)
{
dis[i][i]=0; //顶点i到顶点i的距离初始化为0
}
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
dis[u][v]=w;//根据有向图进行输入;
}
Floyd();
//.......
}
三、适用问题
Floyd适用于求解全源最短路径问题,即对于给定的图G,求解任意两点之间的最短路径长度。