仅用于无向图(不含负权
参考:https://blog.csdn.net/lanshuizhiyun/article/details/77864648
一 利用矩阵的对称性
void floyd()
{
for(int k=1;k<=N;k++)
for(int i=1;i<=N;i++)
{
int t=e[i][k];
for(int j=1;j<=i;j++)
{
e[i][j]=min(e[i][j],t+e[k][j]);
e[j][i]=e[i][j];
}
}
}
二 仅利用矩阵的下三角部分
void floyd()
{
for(int k=1;k<=N;k++)
for(int i=1;i<=N;i++)
if(k!=i)
{
///下三角部分满足行坐标大于列坐标,循环只更新了下三角部分,迭代也只能用下三角部分
int t=(k<i)?e[i][k]:e[k][i];
if(t==inf)///节省时间
continue;
for(int j=1;j<=((k<i)?k:i);j++)
{
if(t+e[k][j]<e[i][j])
e[i][j]=t+e[k][j];
}
for(int j=k+1;j<=i;j++)///若k<i,更新上一轮没更新的k-i的部分
{
if(t+e[j][k]<e[i][j])
e[i][j]=t+e[j][k];
}
}
}
有向图的优化
int e[100][100];
int N;
void floyd()
{
for(int k=1;k<=N;k++)
for(int i=1;i<=N;i++)
if(e[i][k]!=inf)///去掉不必要的循环
for(int j=1;j<=N;j++)
e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
}
void init(int n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
}
int main()
{
int m,a,b,c;
cin>>N>>m;
init(N);
while(m--)///m条边 端点为ab 边长c
{
cin>>a>>b>>c;
if(c<e[a][b])///去掉重边 取较小者
e[a][b]=c;
}
floyd();
///输出省略
return 0;
}
传递闭包–利用关系的传递性
参考:https://blog.csdn.net/wzw1376124061/article/details/69870161
void floyd()
{
for(int k=1;k<=N;k++)
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
e[i][j]=e[i][j]|(e[i][k]&e[k][j]);
}