
图论——tarjin
#
夕林山寸
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法竞赛——进阶指南——acwing 368. 银河 SCC+差分约束+spfa 一道不错的综合题
从题面上看,很容易想到是差分约束。 但是发现数据范围比较大,无法判断无解情况(复杂度为O(nm)). 但我们仔细读题,发现:边权只有0/1。 由于是求每个未知量得最小值。 我们建一个超级源点S,d[S]=0,d[x] - d[S] = 1;这样就能保证每颗星星得最小值为1. 然后把条件按最长路建图。(为什么是最长路,可以仔细想一下,我之前差分约束总结里有详细说) 由于是最长路,无解的情况是存在正环,而由于只有0/1,所以某个环上只要有一个1,那么就无解。 也就是说,我们可以在建图时先判断是否有原创 2020-07-11 09:25:49 · 370 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 367. 学校网络 SCC - tarjan求强连通+思维
先把强连通缩点变成一个新图。(强连通内的点相互可达) 显然: 新图中零入度的点无法被其他点到达,所以必须放置一个软件。 而把所有0入度点放置软件后,其他点总有前置点,即总可达。 所以第一问的结果为0入度点的个数。 第二问证明: 这个证明总结的很好。 https://www.acwing.com/solution/content/4663/ #include<bits/stdc++.h> using namespace std; typedef long long ll; .原创 2020-07-08 18:31:41 · 304 阅读 · 0 评论 -
[HDU-1269] SCC tarjan求强连通分量模板题
简单说一下tarjan 求SCC的思路: dfn[i]:点i的时间戳 low[i]:点i通过i的子树点可达(且有用的)点中时间戳最小的点, x -> y 是有用的: 1:x经过横叉边到达y,且从y出发存在一条路径z(z是x的祖先节点);这样x->z->y 形成一个环路 2:x经过后向边到达其祖先y, 每次经过点x把它加入到栈中。 x回溯时判断dfn[x]是否等于low[x]. 若等于,则把栈中元素弹出到x,与x构成SCC(因为此时其他点一定不会与x构成SCC) ..原创 2020-07-08 16:40:54 · 806 阅读 · 0 评论 -
[模板] scc/强连通分量
类比无向图连通分量。 low[x],dfn[x] #include <bits/stdc++.h> using namespace std; typedef long long ll; #define ls (o<<1) #define rs (o<<1|1) #define pb push_back const double PI= acos(-1.0); const int M = 1e5+7; const int N = 1e5+7; int head[N],原创 2020-07-08 16:22:28 · 266 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing365. 圆桌骑士 v-DCC+二分图染色+思维
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define ls (o<<1) #define rs (o<<1|1) #define pb push_back const double PI= acos(-1.0); const int M = 1e6+7; const int N = 1e3 +7; int head[2*M],cnt=1; struct EDGE{i...原创 2020-07-03 15:43:07 · 391 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 364. 网络 e-DCC + LCA + 并查集 O(M+logn*Q)做法
之前我们暴力枚举路径上的边每次要ON的复杂度太慢了。 考虑我们每次找路径是找自底向上找,,很多次会找到非桥边,造成不必要的浪费步数。 所以我们可以用并查集来压缩路径。 若点x与其父亲的路径从桥边变成非桥边,则把x指向y的祖宗。 这样就能跳过非桥边进行无意义的访问了。 单次复杂度将为logn #include <bits/stdc++.h> using namespace std; typedef long long ll; const int M = 4e5+7; int hea原创 2020-06-30 19:03:41 · 287 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 364. 网络 e-DCC + LCA O(M+NQ)做法
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define ls (o<<1) #define rs (o<<1|1) #define pb push_back const double PI= acos(-1.0); const int M = 4e5+7; int head[M],cnt=1,head_c[M],cnt_c=1; struct EDGE{int to,...原创 2020-06-30 18:07:25 · 2739 阅读 · 0 评论 -
BZOJ1123 BLO 割点+树上不连通点计数
把一个点相连的边去掉。 若其不是割点。则图被分成一个图和一个点。点对个数为:2*(n-1); 否则的话: 对于割点x,把与其相连的边删去: 其儿子节点y,若low[y]>=dfn[x],则以y为根在搜索树上的子树,最终会被分离。其贡献的点对为(即该部分点在前):siz[y]*(n-siz[y]) 若low[y]<dfn[x],则以y为跟在搜索树上的子树,最终会与x的父亲节点在一个联通块内。 然后x节点单独成立一个联通块。 如上图,把1号节点相连的边删去。形成4个联通块。 分别原创 2020-06-28 17:54:12 · 261 阅读 · 0 评论 -
118E - Bertown roads 判桥边
显然,只要不存在桥边,就一定能构成题目要求。 然后dfs重构边即可 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int M = 1e5+7; int head[M],cnt; void init(){cnt=0,memset(head,0,sizeof(head));} struct EDGE{int to,nxt,val;}ee[M*2]; void add(int x,int y)原创 2020-06-16 20:13:10 · 309 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing 363. B城 无向图割点+组合计数
(x,y)(y,x)都要计算。 去掉某个点后: 如果y不是割点:、 则ans[y]+=2*(n-1)//此时只有2个联通块 如果y是割点: 则假设有t个儿子会被分离(即low[x]>=dfn[y]),会形成t+2个联通块。 因为还会有y的儿子xx low[xx]<dfn[y],即删去y,不会使得xx的子树分离。 所以对y来说结果是: 再tarjan...原创 2020-04-26 11:25:15 · 213 阅读 · 0 评论 -
P3388 【模板】割点(割顶) tarjan求无向图割点
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int M = 1e5+7; int head[M],cnt; void init(){cnt=0,memset(head,0,sizeof(head));} struct EDGE{int to,nxt,val;}ee[M*2]; v...原创 2020-04-23 21:37:31 · 156 阅读 · 0 评论 -
tarjan 求无向图桥边
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int M = 1e5+7; int head[M],cnt; void init(){cnt=0,memset(head,0,sizeof(head));} struct EDGE{int to,nxt,val;}ee[M*2]; v...原创 2020-04-23 21:19:50 · 262 阅读 · 0 评论