【图论基础知识总结】
作者:互联网
一、Floyed
用于求解多源最短路,可适用于负边权,有向图无向图都可。
原理:
设f[k][i][j]表示经过节点编号不超过k的点,i到j的最短路,
则f[k][i][j]=min(f[k-1][i][j],f[k-1][i][k]+f[k-1][k][j]).
初值为f[0][i][j]=a[i][j],则答案即为f[n][i][j]
其中k是阶段,循环时需置于外层,且k这一维可以滚动.
Code
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
其实按理说,k这一维应该用0,1两维进行滚动,因为用到的f[i][k],f[k][j]可能已经被更新到k这个阶段的了,但是显然f[k-1][i][k]=f[k][i][k]
应用:
- 传递闭包
给定若干个元素和若干对二元关系,且关系具有传递性(如a<b,b<c,则a<c)。
求出尽量多的元素之间的关系。
如果传递性是无向的,可以用并查集更高效的维护。
但如果是有向的,则可以用floyed进行求解。
Code
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
f[i][j]|=f[i][k]&f[k][j];
- 最小环
标签:总结,图论,Code,滚动,int,短路,基础知识,传递性,一维 来源: https://www.cnblogs.com/glq-Blog/p/16122570.html