其他分享
首页 > 其他分享> > 【图论基础知识总结】

【图论基础知识总结】

作者:互联网

一、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]
应用:

  1. 传递闭包
    给定若干个元素和若干对二元关系,且关系具有传递性(如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];
  1. 最小环

标签:总结,图论,Code,滚动,int,短路,基础知识,传递性,一维
来源: https://www.cnblogs.com/glq-Blog/p/16122570.html