【网络流与二分图】专题链接

【图论】

图论-刘汝佳

完全三部图:图G可被分为三个顶点集,点集内的点相互均没有连边,不同点集的点之间相互均有连边。完全三部图的三元环个数是三点集点数的乘积。

无向无环图就是树。有向无环图DAG方便操作。

有环图可以tarjan缩点。

哈密顿回路(路径):每个点只经过一次的回路,此时显然每条边也只经过一次,是NPC难题。

欧拉回路(一笔画):每条边只经过一次的回路。

【无向图存在欧拉路径】所有点度数均为偶数,或只有两个点的度数是奇数。

【无向图存在欧拉回路】所有点度数均为偶数。

【有向图存在欧拉回路】所有点入度=出度。

欧几里得距离:两个点之间的距离,n维空间中的欧式距离的计算公式为:

【算法】图论

曼哈顿距离:两个点在标准坐标系上的绝对轴距总和,在2维空间中的计算公式为:

【算法】图论(摘自欧几里得距离、曼哈顿距离和切比雪夫距离

 

【最短路】Dijkstra+Heap比SPFA稳得多!

floyd O(n3)

SPFA 虽然理论上界O(nm),但是实际运行效果不错。

SLF优化:设要加入的节点是j,队首元素为i,若dist(j)<dist(i),则将j插入队首,否则插入队尾。

循环队列大小至少开到点数那么大。

bool spfa()
{
    memset(vis,0,sizeof(vis));
    memset(d,0x3f,sizeof(d));
    int head=0,tail=1;q[0]=S;vis[S]=1;d[S]=0;
    while(head!=tail)
     {
         int x=q[head++];if(head>3000)head=0;
         for(int i=first[x];i;i=e[i].from)
          if(d[x]+e[i].w<d[e[i].v])
           {
               int y=e[i].v;
               d[y]=d[x]+e[i].w;
               if(!vis[y])
                {
                    if(d[y]<d[q[head]]){head--;if(head<0)head=3000;q[head]=y;}
                     else{q[tail++]=y;if(tail>3000)tail=0;}
                    vis[y]=1;
                }
           }
         vis[x]=0;
     }
    return d[T];
}
SPFA+SLF优化

相关文章:

  • 2022-01-07
  • 2021-10-04
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-11
  • 2022-03-07
  • 2021-12-04
猜你喜欢
  • 2021-11-15
  • 2022-01-04
  • 2021-07-18
相关资源
相似解决方案