
图论—强连通分量
文章平均质量分 81
Ezereal
这个作者很懒,什么都没留下…
展开
-
Tarjan算法详解
Tarjan算法的用途之一是,求一个有向图G=(V,E)里极大强连通分量。强连通分量是指有向图G里顶点间能互相到达的子图。而如果一个强连通分量已经没有被其它强通分量完全包含的话,那么这个强连通分量就是极大强连通分量。【算法思想】 用dfs遍历G中的每个顶点,通dfn[i]表示dfs时达到顶点i的时间,low[i]表示i所能直接或间接达到时间最小的顶点。(实际操作中low[i]转载 2016-09-13 23:09:56 · 580 阅读 · 0 评论 -
Codeforces Round #347 (Div. 2) D. Graph Coloring(强联通分量缩点+2-SAT)
题意:给你n个点m条边,每条边有一种颜色(B或R),每选择一个点可以使与其相连的所有边的颜色翻转,问最少需要选择多少个点,使得所有边的颜色相同,输出操作数以及操作哪些点。(1 ≤ n,m ≤ 100000)思路:我们可以分别对把所有边变成B和R分别考虑。因为每个点不会操作2次或者更多,因为操作两次相当于不操作,操作三次相当于操作一次。原创 2016-09-16 18:08:56 · 335 阅读 · 0 评论 -
【Educational Codeforces Round 10E】【双连通分量缩环 BFS】Pursuit For Artifacts ★
【trick&&吐槽】1,缩环重建图的时候一定要注意映射关系。【题意】有n(3e5)个点,m(3e5)条双向边(xi,yi,zi)。没有重边没有自环(这个条件其实无所谓)有些边是特殊的边(zi==1)每条边只能经过一次问你我们能否有一条路径,使得我们可以从ST出发到达ED【类型】双连通分量tarjan缩环BFS【分析】这题思考起来有些不着转载 2016-09-13 23:23:21 · 932 阅读 · 0 评论 -
HDU 3622 Bomb Game【2-SAT + tarjan】
题目大意:有N对点,给定这N对点的坐标,现在要求找出一个最大的半径R,使得可以从每对点中选择一个点,并且这N个点以自己为圆心,半径为R的圆两两不相交。 2-SAT问题解法:对于每一对点,我们且称之为“兄弟点”;对于这2*N个点,如果两个点之间“矛盾”,对于本题即两个圆相交,则连一条边。对这个图求强连通分量,然后看是否有某对点属于同一个强连通分量。如果N对点每一对都属于不同的强连通分原创 2016-09-16 23:17:45 · 270 阅读 · 0 评论 -
tarjan算法--求无向图的割点和桥
一.基本概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥。 2.割点:无向连通图中,如果删除某点后,图变成不连通,则称该点为割点。二:tarjan算法在求桥和割点中的应用 1.割点:1)当前节点为树根的时候,条件是“要有多余一棵子树转载 2016-10-11 22:30:54 · 901 阅读 · 0 评论 -
Codeforces Round #364 (Div. 1) C.Break Up
题意:给一张图,给定起点s和终点t,问,至多删除两条边,能否让s与t不连通,如果能,最小代价是多少?题解:首先搜出一条s到t的道路,要删除的边至少有一条属于这条路,否则,该图一定能找到一条s到达t的路径。枚举之,,删除它。在剩下的图中,寻找桥,如果删除这条边后,该图无法形成一条s到t的路径,更新ans。找桥用tarjan,同时要特判当前这条边是否能够沟通s和t#in转载 2016-10-11 23:12:27 · 346 阅读 · 0 评论 -
hdu3671 Boonie and Clyde (Tarjan求割点)
题目大意:给定连通无向图,求可行的点对的数量,该点对可以使图在删去该点对后剩下的图中,至少有一对点不连通。Tarjan求强连通图的复杂度是O(n),如果直接枚举两个点并且求连通的话,总的复杂度为O(n^3)如果先删去一个点,如果剩下的图分成了二个以上的块,则认为只要删去了这个点,剩下n-1个点无论删去哪个都是有效答案。因此对答案贡献为n-1如果分成了两个块,则要分情况讨论。如果有一原创 2016-10-15 16:55:24 · 608 阅读 · 0 评论 -
poj 3177 Redundant Paths tarjan求桥/割边
题目大意:有F个牧场,1给定现有的R条直接连接两个牧场的路,F-1若low[v]>dfn[u],则(u,v)为割边。但是实际处理时我们并不这样判断,因为有的图上可能有重边,这样不好处理。我们记录每条边的标号(一条无向边拆成的两条有向边标号相同),记录每个点的父亲到它的边的标号,如果边(u,v)是v的父亲边,就不能用dfn[u]更新low[v]。这样如果遍历完v的所有子节点后转载 2016-10-15 20:54:59 · 367 阅读 · 0 评论