学渣乱搞系列之Tarjan模板合集

学渣乱搞系列之Tarjan模板合集

            by 狂徒归来

一、求强连通子图

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <climits>
 7 #include <vector>
 8 #include <queue>
 9 #include <cstdlib>
10 #include <string>
11 #include <set>
12 #include <stack>
13 #define LL long long
14 #define pii pair<int,int>
15 #define INF 0x3f3f3f3f
16 using namespace std;
17 const int maxn = 20100;
18 int dfn[maxn],low[maxn],belong[maxn];
19 bool instack[maxn];
20 vector<int>g[maxn];
21 stack<int>stk;
22 int n,m,cnt,scc;
23 void tarjan(int u) {
24     dfn[u] = low[u] = ++cnt;
25     stk.push(u);
26     instack[u] = true;
27     for(int i = 0; i < g[u].size(); i++) {
28         if(!dfn[g[u][i]]) {
29             tarjan(g[u][i]);
30             low[u] = min(low[u],low[g[u][i]]);
31         } else if(instack[g[u][i]]) low[u] = min(low[u],dfn[g[u][i]]);
32     }
33     if(dfn[u] == low[u]) {
34         scc++;
35         int v;
36         do {
37             v = stk.top();
38             instack[v] = false;
39             belong[v] = scc;
40             stk.pop();
41         } while(v != u);//每一个强连通块内de点,以及其属于的scc
42     }
43 }
44 int main() {
45     int i,j,u,v,a,b;
46     while(~scanf("%d %d",&n,&m)) {
47         for(i = 0; i <= n; i++) {
48             dfn[i] = belong[i] = 0;
49             instack[i] = false;
50             g[i].clear();
51         }
52         cnt = scc = 0;
53         while(!stk.empty()) stk.pop();
54         for(i = 1; i <= m; i++) {
55             scanf("%d %d",&u,&v);
56             g[u].push_back(v);
57         }
58         for(i = 1; i <= n; i++)
59             if(!dfn[i]) tarjan(i);
60     }
61     return 0;
62 }

二、求割点

三、求割边/桥

四、求LCA

时间: 2024-10-10 04:06:55

学渣乱搞系列之Tarjan模板合集的相关文章

学渣乱搞系列之dp斜率优化

学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很大部分参考了大神Accept的文章,不过此神貌似早已绝迹江湖,这篇文章写得好,也写得很差,前半部分叙述得很好,可是关键,关键部分说得很乱,有些许错误,很多大神都进行了评论指出,但是大神Accept貌似没有修改的意思,故重新总结下,以便自己以后查阅和复习啊. 下面看一个例题Print Article.

学渣乱搞系列之扩展KMP的那点事

扩展KMP牵涉了一些相对运动的姿势,比较费解!本学渣看了一天的扩展KMP,打算写点东西...本文看后,出现的后果本人一概不负责.毕竟我不是很会表达. 扩展KMP是搞什么灰机的?本学渣所知道的扩展KMP是来解集训篇那道字符串题的.有了犯罪动机,现在就要下手.不要以为扩展KMP就以为与KMP关系暧昧.屁大点事,两个根本不是一个东西.只是有点思想是一致的,就是利用已经匹配的信息避免一些不必要的匹配. 以此提高匹配速度.不过扩展KMP也能干KMP干的事.但是速度没KMP那么快. 扩展KMP要造两个数组,

学渣乱搞系列之网络流学习

学渣乱搞系列之网络流学习 几篇优秀的文章,鉴于本学渣目前功力不够,还不能掌握网络流的精髓要义.故载几篇牛文. Dinic算法: Comzyh的博客 Lich_Amnesia

学渣乱搞系列之字符串滚动哈希

学渣乱搞系列之字符串滚动哈希 by 狂徒归来 我们假定字符串S = S1S2S3S4S5S6S7S8S9. 我们定义哈希函数为 H(S) = (S1bm-1+S2bm-2+S3bm-3+...+Smb0)mod h.其中b是基数,相当于把字符串看成b进制数. b与h为合适的互素的常数. 如何求取字符串内长度为m的一段的字符子串的哈希值? 假定m = 3. 先求取H([S1...S3]) =  S1b2+S2b1+S3b0. 求取H([S2...S4]) = H([S1...S3])*b + S4

学渣乱搞系列之后缀数组

学渣乱搞系列之后缀数组 by 狂徒归来 后缀数组,其nlogn的构造方法,比较麻烦,十几个循环,基数排序?计数排序?各种排序,各种凌乱,学渣表示鸭梨很大啊!学渣从<挑战程序设计竞赛>中偷学了一点nlog2n的构造方法. 字符串后缀(Suffix)是指从字符串的某个位置开始到其末尾的字符串子串.我们认为原串和空串也是后缀. 后缀数组(Suffix Array)指的是将某个字符的所有后缀按字典序排序后得到的数组.排序方式很多,时间复杂度也不同.有基数排序的倍增法o(nlogn),有DC3构造方法o

【模板】各类我会的傻逼算法模板合集(建设中

如果模板有误请杀了我 好了结束了可以关掉了 最大流dinic const int M=100005,N=2*1234; struct edge{ int to,next,cap; }e[M]; int cnt=1,last[N],h[N]; void insert(int a,int b,int c){ e[++cnt]=(edge){b,last[a],c};last[a]=cnt; e[++cnt]=(edge){a,last[b],c};last[b]=cnt; } bool bfs(in

最短路算法模板合集(Dijkstar,Dijkstar(优先队列优化), 多源最短路Floyd)

再开始前我们先普及一下简单的图论知识 图的保存: 1.邻接矩阵. G[maxn][maxn]; 2.邻接表 邻接表我们有两种方式 (1)vector< Node > G[maxn]; 这个是之前就定义了图的大小了,再下面使用的时候就不用对图的大小进行申请了, 但是因为是直接申请了大小 要对图进行初始化,因此可能在某些题目中这样使用的话会超时 (2)vector< vector<Node> > G; 这个是未定义大小,但是在使用之前要对其的大小内存进行申请. G.resi

字符串算法模板合集

1.KMP KMP模板 #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #define ll long long #define INF 2147483647 #define mem(i,j) memset(i,j,sizeof(i)) #define F(i,j,n) for(register int i=j;i&

模板合集

[快速幂运算] long long quickpow(long long x,long long n,long long k) { long long ans=1; while(n>0) { if(n&1) ans=(ans*x)%k; n>>=1; x=(x*x)%k; } return ans; } [矩阵快速幂] [树状数组] #define lowbit(x) x&(-x) void give(int x,int k) { for(int i=x;i<=n;