首页 > TAG信息列表 > dfn
CF375E Red and Black Tree
题目传送门 Solution 非常神奇的一道题。 我们不考虑交换操作,相反,我们去考虑把多少个 \(0\) 的位置变为 \(1\),同时我们记录选了多少个黑点,如果跟原来黑点数量相同即是合法。 此时我们可以发现一个神奇的性质对于 \(u\) 的儿子 \(v\),如果覆盖 \(u\) 的节点不覆盖 \(v\),那么覆盖 \(v给定一个无向图 求最少加多少条路径(任意两点可以两条路径走到) 可以变成双连通分量 (cnt+1)/2
无向图 缩点后 变成 一颗树 叶子结点就是 出度为0 #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 5010,M=20010; int n,m; int h[N], e[M], ne[M], idx; int dfn[N], low[N], timestamp; // 时间戳 int stk[N], top; int id[求一个图的最打的半联通子集=求一个图的最长链方案和个数
拓扑图最长路 等于 背包问题求方案数 因为要求点不同 存在多条边同一情况 需要边判重(set) 拓扑求方案数 #include <iostream> #include <cstring> #include <algorithm> #include <unordered_set> using namespace std; typedef long long LL; const int N = 1e5+10,M=2e6+10;圆方树
狭义圆方树 任意一条边至多只出现在一条简单回路的无向连通图称为仙人掌。 我们对每一个简单环建一个方点。 然后这个环上的所有点与这个方点连边,同时删除原先环上的边 自此我们就建成了一颗狭义圆方树。容易发现不存在相邻的两个方点 P5236 【模板】静态仙人掌 给你一个有 \(n洛谷-P3388 【模板】割点(割顶)
【模板】割点(割顶) tarjan 学了一下割点,发现就是找 \(low[nex] \ge dfn[now]\) 的点,同时根的话要求有两个分支才能作为割点 搜索的时候如果 \(nex\) 没有被访问过,则直接继续搜,如果访问过,则尝试通过 \(dfn[nex]\) 来松弛自己的 \(low[now]\),因为只考虑当前点能跑到的最上面的点,这与CF1027D.Mouse Hunt
题目:花费最少逮老鼠 分析:每个出度为0的强连通分量放置捕鼠器。 1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <string> 5 #include <map> 6 #include <set> 7 #include <queue> 8 #include <stack> 9 #incCF1268E Happy Cactus
题面传送门 我们先来考虑一棵树怎么做。显然先将边排序,然后从大到小加边,每次加边\((x,y)\)以后会使\(f_x=f_y=f_x+f_y\)。 但是很遗憾这个做法并不能直接搬到仙人掌上因为有些点会被算重。我们计算的是路径的数量而要求的是点的数量。 还是延续这个思路,但是当加到一个环的最后一条367. 学校网络
题目链接 367. 学校网络 一些学校连接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(学校 \(A\) 支援学校 \(B\),并不表示学校 \(B\) 一定要支援学校 \(A\))。 当某校获得一个新软件时,无论是直接获得还是通过网络获得,该校都应立即将这个软件通过网络传图的遍历
https://www.luogu.com.cn/problem/P3916 tarjan求强连通分图,(有向图中相互可达),这样把强连通分图缩成点后处理,这个题目中每个强连通分图的答案是同一个 重新建图,图中的点为缩点 dfs深度搜索,初始化每个缩点的答案为tarjan中求得的强连通分图中编号最大的点(M数组),在遍历连接到的点,如2022.7.31学习笔记
主要内容: 1.最小瓶颈路2.kruskal 重构树3.差分约束系统4.强连通分量5.DFS树6.kosaraju算法求SCC7.tarjan算法求SCC8.SAT问题 最小瓶颈路 模板: #include<bits/stdc++.h> #define re return #define lowbit(x) (x&(-x)) #define dec(i,l,r) for(int i=l;i>=r;--i) #define inc(i,l,割点,割边和强连通分量
link 实在惭愧,我已经不会写Tarjan了,很久之前学过但到现在已经忘得一干二净了。 其实割点割边和强连通分量的思想都是基于比较dfn和low值(废话Tarjan算法不就是在求这个吗)。而low的定义就十分关键了,在我看来,low的定义是一个点通过不多于一条非树边且不到达自己父亲的前提下能到达的字符串
哈希与哈希表 • 使用一个哈希函数将某个特定的数字变成另一个数字,这种操作称之为hash。 • 通常我们会以取模运算来作为哈希函数。 • 举例: hash(key)=key%23, 这样数组 [1 ,75,324] -> [1 ,6,2] • 如果哈希后得到的值相同,我们则可用该值建一个链表,把相同的值都放一起, 这样我们缩点—DAG,拓扑排序与Tarjan
模板题Luogu-P3387 1.DAG 说缩点,就必须要先说DAG 有向无环图(DAG),是一种特殊的有向图,它没有有向环; 这就是个DAG 这个就是不是DAG,那你觉得里面有几个环呢? 事实上只有一个,2-3-4-5是一个环 你可能觉得5-9-8-7也是,但其实它不能算环,因为它们不是一个强连通分量 强连通分量就是若存在点圆方树(tarjan点双联通分量)
板子 int low[N],dfn[N],stk[N],tp,dfn_cnt; void tarjan(int u,int fa) { dfn[u]=low[u]=++dfn_cnt; for(rint i=head[u];i;i=e[i].nxt) { int v=e[i].to; if(v==fa)continue; if(!dfn[to]) { tarjan(v,u);学校网络
学校网络 题目描述: 一些学校连接在一个计算机网络上,学校之间存在软件支援协议,每个学校都有它应支援的学校名单(学校 A 支援学校 B,并不表示学校 B 一定要支援学校 A)。当某校获得一个新软件时,无论是直接获得还是通过网络获得,该校都应立即将这个软件通过网络传送给它应支援的学校。因缩点
摘抄自 #include <bits/stdc++.h> using namespace std; #define debug(x) cout << #x << "=" << x << endl; const int N = 1e4 + 5; int n, m, cn, col[N]; int a[N], val[N], f[N], deg[N]; int top, stc[N], vis[N], dn, dfn[N],论求 $lca$ 最有效的方法是
目录 \(standard\_table\) : 欧拉序 + \(ST\) 表 \(multiplication\) : 倍增 \(tree_chain_subdivision\) : 树链剖分 #include<bits/stdc++.h> using namespace std; const int N=5e5+5; inline int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(cTarjan 基础用法 (仅代码版)
struct Tarjan { int dfn[maxn], low[maxn], Time; bool vis_cutnode[maxn], vis_bridge[maxn]; combo Tarjan_gd(int u, int fa) {//有/无 向图的割点 dfn[u] = low[u] = ++ Time; int cnt = 0; for (int i = heade[u]; i; i = e[i].n【Coel.学习笔记】2-SAT 问题
终于结束网络流了,真有够累的…… 接下来图论就还剩一点点了,加油~ SAT 问题相关概念 SAT 是 \(\mathcal{Satisfaction}\) 的英文缩写,意为“适应性”。对于若干个命题,每个命题都有且只有“真”和“假”两种取值。接下来会给出若干个条件,每个条件都形如“\(x_i\) 为真/假或 \(x_j\)桥与割点
前言: 就在前天,我学习了图的桥与割点。偷懒了两天后经过两天的理解,我,终于写写出了代码并写好了注释(^_^),今天就来写博客啦~ 桥详细讲解: 首先,去找一张图。如下: (这张图画得我好累) 那么,桥是什么呢? 在一个无向图G中,若去掉一条边e,使图G分裂为两个不相连的子图,则称边e为图G的桥或割边。双连通分量
点双连通分量 在一个连通图中(无向图)任选两点,如果他们之间至少存在两条“点不重复”的路径,称这个图为点双连通。一个图中的点双连通极大子图称为“点双连通分量”(block,2-connected component,BCC)。点双连通分量是个“可靠”的图,去掉任意一个点,其他点任然是连通的。也就是说,点双连通性问题学习笔记
基本概念 下面介绍几个概念: 强连通(Strongly Connected),如果这个有向图任意两点连通,那么这个图是强连通的。 (有向图的)强连通分量(Strongly Connected Components,SCC),指一个图中,极大的强连通的子图。 例子: 图片来源:初探Trajan算法(求强连通分量) - Styx 的博客 - 洛谷博客 这个图中,最这次应该叫高二上一调
T1 匹配 分析 据说是个kmp的板子,但是我把kmp基本忘光了,所以打的哈希,然后赛后去复习了kmp。。。。 AC 代码 #include <iostream> using namespace std; #define ll long long inline int in(){ int x = 0; bool f = 0; char c = getchar(); while(c > '9' || c[luogu4429]染色
显然每一个连通块独立,不妨假设原图连通,并建立dfs树 假设树上有$k$条返祖边,并记其覆盖的点集分别为$V_{1},V_{2},...,V_{k}$ 显然有奇环时无解,因此不妨假设$\forall 1\le i\le k,|V_{i}|\equiv 0(mod\ 2)$,进而$|V_{i}|\ge 4$ 结论:恒有解$\iff \forall 1\le i<j\le k,V_{i}$和$V_{j}LightOJ-1348 Aladdin and the Return Journey
Aladdin and the Return Journey 树链剖分模板题 结点单点修改 #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace std; const int maxn = 3e4 + 10; vector<int>gra[maxn]; int dep[maxn]; int siz[maxn]; in