连通图
文章平均质量分 52
issue是fw
19 years old, struggling in life, chasing daydreams.
展开
-
【模板】2-SAT 问题
LINK问题nnn个布尔变量,mmm组限制,每组限制形如a,x,b,ya,x,b,ya,x,b,y表示a=xa=xa=x和b=yb=yb=y一定有一个成立(其中x,yx,yx,y是布尔值)求出一组可行解,或者说明这是不可能的2-SAT这篇博客讲的不错,下面的图片都是"借"的拆点,原图中的点iii表示falsefalsefalse,i+ni+ni+n表示truetruetrue对于a=true∣∣b==falsea=true||b==falsea=true∣∣b==false一定成立其中的至少原创 2021-04-01 21:15:20 · 207 阅读 · 1 评论 -
3694 Network(边双连通+并查集缩点)
LINK边双连通缩点变成一棵树,每次连接a,ba,ba,b就是把中间的边都变成非割边显然可以树剖维护有多少边已经不是割边了,但是大材小用。我们得到了一棵树,每次让a,ba,ba,b往上跳lcalcalca让路径上的点都变成000就好了暴力跳fatherfatherfather复杂度比较高,由于一条边变成非割边就没用了,那么可以合并这条边当然是把儿子并查集合并到父亲去,然后每次去父亲的祖先节点这样保证每条边只被经过一次就被缩掉进一步观察,我们甚至不需要真的建立一颗树只需要在每次发现非割边的时候原创 2021-03-30 17:23:05 · 230 阅读 · 0 评论 -
Tarjan离线求lca
这篇博客写的非常好tarjan步骤①.任选一个点为根节点,从根节点开始。②.遍历该点u所有子节点v,并标记这些子节点v已被访问过。③.若是v还有子节点,返回2,否则下一步。④.合并v到u上。⑤.寻找与当前点u有询问关系的点v。⑥.若是v已经被访问过了,则可以确认u和v的最近公共祖先为v被合并到的父亲节点。来洛谷交一发~#include <bits/stdc++.h>using namespace std;const int maxn = 2e6+10;struct edg原创 2021-03-30 16:21:47 · 234 阅读 · 1 评论 -
P3225 [HNOI2012]矿场搭建(点双连通)
LINK题意一个无向图,你可以把任意点变成逃生口。使得去掉任意一个点后,其余点都能到逃生口.问逃生口的最小数目,以及最小数目下放置的方案数如果图中没有割点,去掉任何一个点都是连通的,最坏情况下是去掉了逃生口所以这种情况需要两个逃生口否则,考虑割点被去掉,原图被分成若干个连通块那每个连通块都需要有逃生口,所需要的逃生口就是连通块的个数方案数就是每个连通块大小的乘积...原创 2021-03-30 10:06:58 · 258 阅读 · 0 评论 -
P5058 [ZJOI2004]嗅探器(割点的理解)
LINK答案必定是某个割点,但是割点并不一定是答案移除割点后,原图被分成若干个部分,如何判断a,ba,ba,b在不同的连通块??我们知道,我们认定uuu是割点是因为存在dfn[u]<=low[v]dfn[u]<=low[v]dfn[u]<=low[v]此时vvv的子树无法回到更浅的节点,割掉uuu,将与其他部分丧失联系如果bbb在vvv的子树内,那么uuu必定是答案之一bbb在子树内必然有dfn[b]>=dfn[v]dfn[b]>=dfn[v]dfn[b]>原创 2021-03-28 20:25:52 · 243 阅读 · 0 评论 -
P3119 [USACO15JAN]Grass Cownoisseur G(tarjan+dp)
LINK先缩点,在DAGDAGDAG上跑最长路可以得到dis[v]dis[v]dis[v]表示111号点的联通分量到vvv连通分量最多走多少草坪当走到uuu点时使用反向机会走到点vvv,其中vvv一定是能到达点111所属的连通分量的所以以111所在联通分量为起点,终点分别跑一次最长路然后枚举那个中转点计算答案即可#include <bits/stdc++.h>using namespace std;const int maxn = 1e6+10;const int inf =原创 2021-03-28 19:44:26 · 242 阅读 · 0 评论 -
P5676 [GZOI2017]小z玩游戏(tarjan+虚点优化建图)
LINK若存在w[v]%e[u]==0w[v]\%e[u]==0w[v]%e[u]==0说明玩完游戏uuu马上可以玩游戏vvv,我们连上一条uuu到vvv的边那么游戏能玩两次以上相当于在这个有向图中处于一个环,可以玩无限多次直接上tarjantarjantarjan找环即可但是这样连边是O(n2)O(n^2)O(n2)的,需要优化我们建立一排虚点,分别表示数字[1,100000][1,100000][1,100000]我们让游戏iii向数字e[i]e[i]e[i]连边,数字w[i]w[i]w[原创 2021-03-28 17:01:59 · 259 阅读 · 0 评论 -
P3469 [POI2008]BLO-Blockade(tarjan搜索树)
LINK使用tarjantarjantarjan求出割点,显然非割点的答案是2∗(n−1)2*(n-1)2∗(n−1)如果是割点,割掉之后,会把原图分成若干个连通块下面的讨论暂时不计算点uuu的贡献考虑在tarjantarjantarjan形成的dfsdfsdfs树中uuu的儿子分别是v1,v2,v3...v_1,v_2,v_3...v1,v2,v3...,子树大小分别是siz[v1],siz[v2],siz[v3]...siz[v_1],siz[v_2],siz[v_3]...siz[v1原创 2021-03-28 15:34:15 · 212 阅读 · 0 评论 -
Tarjan经典问题合集
问题Ⅰ.无向图必经点\color{Red}问题Ⅰ.无向图必经点问题Ⅰ.无向图必经点无向图给定a,ba,ba,b,找出哪些点是a,ba,ba,b路上的必经点.算法Ⅰ.针对固定的u,v,找所有的必经点问题传送门首先必经点一定是割点,否则移除那个点,对图的连通性无影响首先从点aaa开始tarjantarjantarjan,制造出一颗dfsdfsdfs搜索树若由于某个儿子vvv判断了uuu是割点,删去点uuu后vvv子树都会和aaa丧失联系这个非常重要,因为这就是判断割点的定义,不通过回边回到更浅节点原创 2020-12-01 14:59:52 · 231 阅读 · 0 评论 -
HDU 3896Greatest TC(tarjan搜索树好题)
题意给定无向图,给出qqq个询问传送门给定(u,v)(u,v)(u,v),问删去某条边是否还连通,删去某个点是否还连通解析关于连通性,直接上tarjantarjantarjan制造一颗dfsdfsdfs的搜索树对于(c,d)边\color{Red}对于(c,d)边对于(c,d)边首先如果(c,d)(c,d)(c,d)不是桥,对连通性无影响如果是桥,删去后图会分成两半,一半含ccc一半含ddd令ccc是搜索树中深度大的那个节点若a(b)a(b)a(b)在ccc的子树内且b(a)b(a)b(原创 2020-12-01 14:58:45 · 257 阅读 · 0 评论 -
HDU 4635 Strongly connected(经典强连通思维)
传送门加了一些边后,一定分成了若干个连通分量如果有大于两个连通分量,那么连通分量间还可以继续加边,不符合那么记第一个连通分量是xxx部,第二个是yyy部不可能同时存在xxx到yyy的边和yyy到xxx的边这样会把两个连通分量合并成一个所以两个连通分量内部都是完全图,且xxx部所有点连向yyy(反过来也没关系)边数为ans=x∗(x−1)+y∗(y−1)+xyans=x*(x-1)+y*(y-1)+xyans=x∗(x−1)+y∗(y−1)+xyans=x2+y2−x−y+xyans=x^2+原创 2020-11-13 17:16:00 · 236 阅读 · 0 评论 -
HDU 4612 Warm up(重边+边双连通+树的直径)
传送门非常裸的一题就是边双连通缩点成一棵树,然后树上所有边都是桥那么连接任意两点,树的路径上都不再是桥所以就找树的直径即可但是这里会出现重边,那么需要特殊的处理方式#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <vector>using namespace std原创 2020-11-13 15:53:44 · 207 阅读 · 0 评论 -
POJ - 3694 Network(边双连通+树剖)
VJ传送门题意一张无向图,动态加边,询问每次的割边数量.直接上边双连通缩点因为一个边双内是没有割边的,缩点后是一颗树那么树上的任何一条边都是割边加一条边成环,两点间的树边都变得不再是割边那么这个过程我们可以用树剖来完成.(发现两种边双缩点有一种过不了,找了几个小时,至今不明白原因…)#include <iostream>#include <cstdio>#include <cstring>#include <vector>using原创 2020-11-11 21:04:48 · 293 阅读 · 5 评论 -
Poj 3352 Road Construction(边双模板)
VJ传送门边双连通缩点裸题因为这是一个连通图,边双连通可以先缩点这样是一颗树,任意两点间只有一条路那么统计入度为零的点,用边两两连接起来每个点的度都大于222,这样一定是一个边双#include <iostream>#include <cstdio>#include <cstring>#include <algorithm> using namespace std;const int maxn = 2e5+10; struct edge原创 2020-11-10 16:49:32 · 252 阅读 · 0 评论