图论
loveicecola
AFO
展开
-
树上倍增求LCA
#include<bits/stdc++.h>using namespace std;void dfs(int x,int fa){ v[x]=1; for(int i=lin[x];i;i=Next[i]){ int y=ver[i]; if(v[y]) continue; f[y][0]=x; for(int i=1;i<=25;++i){ f...原创 2018-11-08 17:38:45 · 105 阅读 · 0 评论 -
最大流——Dinic
上回介绍了EK算法,这次来学一个效率更高的算法。我们在做EK算法的时候,每次bfs最多遍历了整个残量网络,但是只找到了一条增广路。所以有可以优化的地方。Dinic算法基于分层图,我们先bfs找到一个合法的有向无环图(图中所有边都有残流,图严格按照拓扑序),然后在这张分层图上通过深度优先搜索找到若干条合法不冲突的增广路,累加到maxflow里。并且可以在dfs里添加剪枝:如果当前点以后找不到...原创 2019-01-09 11:46:29 · 635 阅读 · 0 评论 -
最大流——EK算法
EK算法是求最大流的一种容易实现、代码易懂的算法。 EK算法仍然是一个基于增广路的算法,思路非常简单。每次从S尝试找到一条到达T的路径,路径上最小的残留量大于0,那么我们就可以把这条路上的最小残留量减去,累加到ans里。继续bfs直到找不到位置,此时ans就是最大流。 EK增广路算法的时间复杂度为O(nm^2)。但是在实际运营中远远达不到这个上界,效率较高,一般认为,可以处...原创 2019-01-09 11:47:45 · 1955 阅读 · 0 评论 -
匈牙利算法
匈牙利算法又被称为增广路算法。 什么是增广路? 对于任意一组匹配S,属于S的边被称为匹配边,不属于S的被称为非匹配边。如果二分图中存在一条连接两个非匹配点的路径path,使得非匹配边与匹配边在path上交替出现,那么我们称path是匹配S的一条增广路。 增广路的性质: 1.长度为奇数 2.路径上第1、3、5...、len条边是非匹配边,第2、4、6...、len-1条...原创 2019-01-09 11:49:17 · 287 阅读 · 0 评论 -
二分图带权匹配
带权匹配是指在最大匹配的基础上,使匹配边的边权和最大。一般有两种写法,一个是KM算法(只针对可以完备匹配的二分图),一个是费用流。 KM算法在稠密图上比费用流更优秀一些,不过应用范围太小,所以还是鼓励大家用费用流。当然啦,作为一种算法KM也是我们需要了解的(况且我不会网络流原创 2019-01-09 11:52:42 · 667 阅读 · 0 评论