无重边有向连通图的强连通分量

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<stack>
 6 using namespace std;
 7 int n,m,ntime;//ntime记录dfs访问时间
 8 int instack[11000];//标记点是否在栈中
 9 int dfn[11000];//节点在dfs过程中的访问序号(也可以叫做开始时间)
10 int low[11000];//从该节点出发dfs过程中该节点下方节点(开始时间大于该节点的开始时间,且由该节点可达的节点)所能到达的最早的节点的开始时间,初始low数组等于dfn数组
11 vector<vector<int> > g;
12 stack<int> st;
13 void tarjan(int u)
14 {
15     int i,v;
16     dfn[u]=low[u]=ntime++;
17     st.push(u);
18     instack[u]=1;

19     for(i=0;i<g[u].size();i++)//从u出发的每一条边
20     {
21         v=g[u][i];
22         if(dfn[v]==0)//v还没被访问过
23         {
24             tarjan(v);
25             low[u]=min(low[u],low[v]);
26         }
27         else if(instack[v])//v在栈中
28         {
29             low[u]=min(low[u],dfn[v]);
30         }
31     }
32     if(dfn[u]==low[u])//u是一个强连通分量的根
33     {
34         do
35         {
36             v=st.top();
37             st.pop();
38             instack[v]=0;
39             printf("%d ",v);//输出属于这个强连通分量的所有的点的编号
40         }while(u!=v);
41         printf("\n");
42     }
43 }
44 int main()
45 {
46      int i;
47      while(scanf("%d%d",&n,&m)!=EOF)
48      {
49      g.clear();
50      g.resize(11000);
51      while(!st.empty()) st.pop();
52      ntime=1;
53      memset(instack,0,sizeof(instack));
54      memset(dfn,0,sizeof(dfn));
55      memset(low,0,sizeof(low));
56      int u,v;
57      for(i=0;i<m;i++)//点从1开始编号
58      {
59          scanf("%d%d",&u,&v);
60          g[u].push_back(v);
61      }
62      tarjan(1);
63      }
64      return 0;
65 }
时间: 2024-08-28 11:30:15

无重边有向连通图的强连通分量的相关文章

【连通图|强连通分量+缩点】POJ-1236 Network of Schools

Network of Schools Time Limit: 1000MS Memory Limit: 10000K Description A number of schools are connected to a computer network. Agreements have been developed among those schools: each school maintains a list of schools to which it distributes softwa

【连通图|二分匹配+强连通分量】POJ-1904 King&#39;s Quest

King's Quest Time Limit: 15000MS Memory Limit: 65536K Case Time Limit: 2000MS Description Once upon a time there lived a king and he had N sons. And there were N beautiful girls in the kingdom and the king knew about each of his sons which of those g

TarJan 算法求解有向连通图强连通分量

[有向图强连通分量] 在有向图G中,如果两个 顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components). 下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达.{5},{6}也分别是两个强连通分量. 大体来说有3中算法Kosaraju,Trajan,Gabow这三种!后续文章中将相继

【连通图|强连通分量+最长路】POJ-3592 Instantaneous Transference

Instantaneous Transference Time Limit: 5000MS Memory Limit: 65536K Description It was long ago when we played the game Red Alert. There is a magic function for the game objects which is called instantaneous transfer. When an object uses this magic fu

【连通图|强连通分量+dfs】POJ-3160 Father Christmas flymouse

Father Christmas flymouse Time Limit: 1000MS Memory Limit: 131072K Description After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends such as cleaning out the computer lab for training as extension of his contr

POJ 3177 Redundant Paths(强连通分量)

题目链接:http://poj.org/problem?id=3177 题目大意是一个无向图给你n个点m条边,让你求出最少加多少条边 可以让任意两个点相通两条及以上的路线(每条路线点可以重复,但是每条路径上不能有重边),简单来说就是让你加最少的边使这个图变成一个双连通图. 首先用tarjan来缩点,可以得到一个新的无环图,要是只有一个强连通分量,那本身就是一个双连通图.要是多个强连通分量,那我们可以考虑缩点后度数为1的点(肯定是由这个点开始连新边最优),那我们假设数出度数为1的点的个数为cnt,

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

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

(转)Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)

本文转载自:http://hi.baidu.com/lydrainbowcat/item/f8a5ac223e092b52c28d591c 作者提示:在阅读本文之前,请确保您已经理解并掌握了基本的Tarjan算法,不会的请到http://hi.baidu.com/lydrainbowcat/blog/item/42a6862489c98820c89559f3.html阅读.   基本概念:   1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如

强连通分量、割点、桥

一.强连通分量 在有向图G中,如果任意两个不同的顶点相互可达,则该有向图为强连通的:一个有向图G的极大连通子图称为G的强连通分支:将有向图G的每一条边反向形成的图称为G的转置 Gt. 1.1 有向图的一些定理 有向无环图中唯一出度为0的点,一定可以由任何点出发到达     图中节点的数目为有限多个,而且无环,因此从任何点出发往前走,一定终止于出度为0的点,否则走N+1步(N为图中节点的数目),则必然有一个点被走了两次,形成了环,与无环矛盾! 有向无环图中所有入度不为0的点,一定可以由某个入度为0