强连通分量Tarjan模板
- #include<iostream>
- #include<stdio.h>
- #include<string.h>
- #include<stack>
- #include<vector>
- #include<algorithm>
- #define N 1000
- using namespace std;
- int pre[N],lowlink[N],sccno[N],dfn_clock,scc_cnt;
- stack<int> stk;
- vector<int> G[N];
- void DFN(int u)
- {
- pre[u] = lowlink[u] = ++dfn_clock; //时间戳
- stk.push(u);
- int i;
- for(i=;i<G[u].size();i++)
- {
- int v = G[u][i];
- if(!pre[v]) //没有访问过
- {
- DFN(v);
- lowlink[u] = min(lowlink[u],lowlink[v]);
- }
- else if(!sccno[v]) //被访问过,但是不是其他强连通图的组成
- {
- lowlink[u] = min(lowlink[u],pre[v]);
- }
- }
- if(lowlink[u]==pre[u]) //发现一个强连通分量
- {
- scc_cnt++; //强连通分量的个数计算
- while()
- {
- int x = stk.top();
- stk.pop();
- sccno[x] = scc_cnt;
- if(x==u) break;
- }
- }
- }
- void find_scc(int n)
- {
- dfn_clock = scc_cnt = ;
- memset(sccno,,sizeof(sccno));
- memset(pre,,sizeof(pre));
- int i;
- for(i=;i<=n;i++)
- if(!pre[i]) DFN(i);
- }
- int main()
- {
- int n,m;
- scanf("%d%d",&n,&m);
- int i;
- for(i=;i<m;i++)
- {
- int a,b;
- scanf("%d%d",&a,&b);
- G[a].push_back(b); //构造图
- }
- find_scc(n); //查找强连通图
- for(i=;i<=n;i++)
- printf("%d ",sccno[i]);
- putchar();
- return ;
- }
- /*
- //测试用图
- 6 8
- 1 3
- 3 5
- 5 6
- 3 4
- 4 6
- 4 1
- 1 2
- 2 4
- */
强连通分量Tarjan模板的更多相关文章
- 强连通分量(Tarjan)模板
贴模板,备忘. 模板1: #include<iostream> #include<cstring> #include<cmath> #include<cstd ...
- 强连通分量(tarjan求强连通分量)
双DFS方法就是正dfs扫一遍,然后将边反向dfs扫一遍.<挑战程序设计>上有说明. 双dfs代码: #include <iostream> #include <cstd ...
- 【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)
Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶 ...
- tarjan求强连通分量(模板)
https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...
- 图的连通性:有向图强连通分量-Tarjan算法
参考资料:http://blog.csdn.net/lezg_bkbj/article/details/11538359 上面的资料,把强连通讲的很好很清楚,值得学习. 在一个有向图G中,若两顶点间至 ...
- 求图的强连通分量--tarjan算法
一:tarjan算法详解 ◦思想: ◦ ◦做一遍DFS,用dfn[i]表示编号为i的节点在DFS过程中的访问序号(也可以叫做开始时间)用low[i]表示i节点DFS过程中i的下方节点所能到达的开始时间 ...
- POJ1236_A - Network of Schools _强连通分量::Tarjan算法
Time Limit: 1000MS Memory Limit: 10000K Description A number of schools are connected to a compute ...
- 【有向图】强连通分量-Tarjan算法
好久没写博客了(都怪作业太多,绝对不是我玩的太嗨了) 所以今天要写的是一个高大上的东西:强连通 首先,是一些强连通相关的定义 //来自度娘 1.强连通图(Strongly Connected Grap ...
- 有向图强连通分量 Tarjan算法
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
随机推荐
- hdu 3440 差分约束
看完题目第一遍,感觉很简单.当写完程序跑测试用例的时候,发现第二个总是过不了,然后好好研究了一下测试用例,才知道原来不是程序有问题,而是我的建图方式错了.对于这些无序的点,如果高的在右边,不等式是di ...
- 转: Lua 语言 15 分钟快速入门
看点: 1. 以很特殊的方式工,把Lua的语法全部输出一段,很容易让人记住..不错 转: http://blog.jobbole.com/70480/
- mac下的常用操作
打开 应用程序(command+shift+A)-实用工具-终端 open . 直接打开Macintosh系统目录 其他口令(与linux一样)ls 显示当前目录内 ...
- double的值太大,以及补0
当double的值太大的时候,比如1000000000 用DecimalFormat: double d = 1.0E7; System.out.println(new DecimalFormat(& ...
- Android 异常捕获
在用户使用APP时,如果APP毫无征兆的突然退出程序,又没有任何提示信息.我想这是一种最差劲的用户体验了吧,如果是我估计干脆就直接卸载APP了.因此,作为Android开发者对于这种情况的发生一定要有 ...
- 使用EntityFramework连接 Mysql
原文:使用EntityFramework连接 Mysql 1,安装VS.net 插件 http://forums.mysql.com/read.php?174,601041,601041 2,安装连接 ...
- LeftOuterJoin和OuterApply性能比较(转)
建立测试环境: 建立一个表Department和Employee,并向Department插入50W条记录,向Employee插入200W条记录, 我们就拿[统计DepartmentID 从15000 ...
- Mingw64编译wxWidgets3.0.2常见错误
使用Mingw64编译wxWidgets3.0.2,首先得下载wxMSW-Setup-3.0.2.exe(https://sourceforge.net/projects/wxwindows/file ...
- CSS 绝对定位和相对定位
CSS定位属性:一个定位属性,需配合四个定位坐标,实现定位 固定定位fixed 说明: 1.固定定位是相对于"浏览器窗口" 2.如果只设置了定位属性,未指定定位坐标时,元素将停留在 ...
- Map的三种遍历方式
对于Map的三种方式遍历 1.keySet() 2.values() 3.entrySet()三种方式得到Set之后,都可以使用 foreach或者iterator, 不能使用for,因为数据结构决定 ...