题解:题意就是求二分图的必须边。我们有结论:在残量网络上跑tarjan,对于一条边(u,v)如果该边满流||scc[u]==scc[v],那么该边是可行边。因为如果scc[u]==scc[v],那么说明v到u有通路,我们把v-u的路以及u-v这条边全部反色,也就是匹配->非匹配,非匹配->匹配。同样...
分类:
其他好文 时间:
2014-12-28 14:04:26
阅读次数:
485
比起双连通的Tarjan我倒是觉得反而简单多了。思想和双连通分量是同一个模式。
#include
#include
#include
#include
using namespace std;
const int N = 1e5;
int dfn[N], scc_id[N];
int deep, scc_cnt;
stack s;
int dfs(int u)
{
int ...
分类:
其他好文 时间:
2014-12-26 18:40:43
阅读次数:
172
比起求无向图关节点的算法,只是多了一个栈,用来储存不存在关节点的所有边,遇到关节点之后弹出所有边进行储存
int dfs(int u, int fa)
{
int lowu = dfn[u] = ++deep;
int son = 0;
for(int i = head[u]; ~i; i = e[i].next) {
int v = e[i].v;
...
分类:
其他好文 时间:
2014-12-26 06:13:59
阅读次数:
206
题目大意:给出一张有向图,若一个点能够到达另一个点,那么说这两个点是一对联通点。问图中共有多少联通点。
思路:先进行一次Tarjan,求出所有的scc,对于一个scc中的点,对答案的贡献就是cnt^2,不同的scc组成了一张可拓扑图,然后对于每个scc维护一个bitset,来统计他自己和标号比它小的scc中共有多少个不同的点。然后进行dp,其中不停的或就可以了。
第一次使用bitset...
分类:
Web程序 时间:
2014-12-23 15:38:11
阅读次数:
238
首先还是说明这是一个坑然后tarjan以前一直处于懵懵懂懂的状态,决定痛改前非好好学。tarjan可以用来求强联通分离。它有两个数组,一个是dfn,一个是low。定义DFN(u)为节点u搜索的次序编号(时间戳)。Low(u)为u或者u的子树能够追溯到的最早的栈中的节点的次序号。然后就发现u的儿子无非...
分类:
其他好文 时间:
2014-12-19 23:13:36
阅读次数:
229
http://acm.hdu.edu.cn/showproblem.php?pid=4738
题意:给定一张无向图,求其中权值最小的一座桥,派最少的士兵去炸掉它!!
思路:直接用tarjan计算出桥并且取其中权值最小者。
此题坑点甚多,1、有可能桥本来就不联通,输出-1。2、桥最小者为0,输出1(至少排一个人去炸桥)。3、不要去重边,两个岛之间允许有多座桥,tarjan忽略返回边只忽略一次,...
分类:
其他好文 时间:
2014-12-16 21:03:01
阅读次数:
198
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586思路:在求解最近公共祖先的问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,非常好的处理技巧就是在回溯到结点u的时候,u的子树已经遍历, 这时候才把u结点放入合并集合中,这样u结点和所...
分类:
其他好文 时间:
2014-12-15 01:24:41
阅读次数:
266
很好的参考资料:http://taop.marchtea.com/04.04.html 下面的配图和部分文字转载于此文章
离线算法就是指统一输入后再统一输出,而不是边输入边实时输出。Tarjan算法的复杂度为O(N+Q),Q为询问的次数.
由于是离线算法,所以要保存输入的信息,次序问题。
若两个结点u、v分别分布于某节点t 的左右子树,那么此节点 t即为u和v的最近公共祖先。更进...
分类:
编程语言 时间:
2014-12-09 21:27:58
阅读次数:
366