强连通模板

 1 void dfs(int u)
 2 {
 3     dfn[u]=low[u]=++dfs_cut;
 4     vs[u]=1;
 5     s.push(u);
 6     for (int i=0;i<g[u].size();i++)
 7     {
 8        int v=g[u][i];
 9         if(!vs[v])
10         {
11             dfs(v);
12             low[u]=min(low[v],low[u]);
13         }
14         else if (!scc[v]) low[u]=min(low[u],dfn[v]);
15     }
16     if (low[u]==dfn[u])
17     {
18         gcc_cut++;
19         int cut=0;
20         while (1)
21         {
22             int v=s.top();
23             cut++;
24             s.pop();
25             scc[v]=gcc_cut;
26             if (u==v) break;
27
28         }
29         ans[gcc_cut]=cut;
30     }
31 }
时间: 2024-11-05 19:28:33

强连通模板的相关文章

HDU 1269 强连通模板 Tarjan算法

求强连通量,为1输出Yes否则No Tarjan算法模板 具体讲解:https://www.byvoid.com/zht/blog/scc-tarjan #include "stdio.h" #include "string.h" struct Edge { int v,next; }edge[100010]; int head[10010],stack[10010],dfn[10010],low[10010]; // stack栈: dfn深搜次序数组:low结点

HDU-1269-迷宫城堡(强连通 模板)

链接:https://vjudge.net/problem/HDU-1269 题意: 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间.Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间

【强连通】强连通模板 Tarjan

比起双连通的Tarjan我倒是觉得反而简单多了.思想和双连通分量是同一个模式. #include <cstdio> #include <cstring> #include <cstdlib> #include <stack> using namespace std; const int N = 1e5; int dfn[N], scc_id[N]; int deep, scc_cnt; stack <int> s; int dfs(int u)

HDU 1269 迷宫城堡(强连通)

HDU 1269 迷宫城堡 题目链接 题意:中文题 思路:强连通模板题 代码: #include <cstdio> #include <cstring> #include <vector> #include <stack> using namespace std; const int N = 10005; int n, m; vector<int> g[N], scc[N]; int pre[N], lowlink[N], sccno[N], d

Hdu 1269 强连通判定

题目链接 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7097    Accepted Submission(s): 3159 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道

Summer Holiday

Summer Holiday Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 27 Accepted Submission(s): 20   Problem Description To see a World in a Grain of Sand And a Heaven in a Wild Flower, Hold Infinity i

图论--有向图强连通分量的标记及缩点模板

有向图中在若两点之间可以互相到达,则称这两点强连通,如果一个点集内的所有点都可以互相到达,那么这个点集就是图的一个强连通分量,而我们需要找出有向图中的所有极大强连通分量,于是就用Tarjan算法进行强连通,并将一个连通块缩成一个点,这样就可以形成了一张有向无环图,对解题会很有帮助. 找强连通分量的方法就是 dfs 寻找某个点以及它的后继节点能够到达的最远祖先节点,如果这个最远祖先节点就是进入 dfs 的点,说明所有搜到的后继节点都是在这个强连通分量中,就依次将他们标记为同一个强连通分量. hea

连通分量模板:tarjan: 求割点 &amp;&amp; 桥 &amp;&amp; 缩点 &amp;&amp; 强连通分量 &amp;&amp; 双连通分量 &amp;&amp; LCA(最近公共祖先)

PS:摘自一不知名的来自大神. 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合. 3.点连通度:最小割点集合中的顶点数. 4.割边(桥):删掉它之后,图必然会分裂为两个或两个以上的子图. 5.割边集合:如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合. 6.边连通度:一个图的边连通度的定义为,最

【模板】强连通分量和tarjan算法

看了好久才终于明白了这个算法..复杂度是O(n+m). 我觉得这个算法不是很好理解,但是看懂了以后还是觉得听巧妙的. 下面给出模板代码和三组简单数据帮助理解. 代码如下: 1 #include <stdio.h> 2 #include <stack> 3 #include <algorithm> 4 #include <string.h> 5 #include <vector> 6 using namespace std; 7 8 const i