在有向图中,若两点至少包含一条路径可以到达,则称两个顶点强连通,若任意两个顶点皆如此,则称此图为强联通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。

  

  中间查找过程类似于深度优先搜索和并查集。

代码实现:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <ctime>
#include <cstdlib>
#include <map>
#include <set>
using namespace std;
#pragma comment(linker, "/stck:1024000000,1024000000")
#define lowbit(x) (x&(-x))
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<=y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.1415926535897932384626433832
#define ios() ios::sync_with_stdio(true)
#define INF 1044266558
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
int dnf[],low[],pos[],vis[];
int n,k=-,g[][],ans=,m,num=;
void tarjan(int u)
{
dnf[u]=low[u]=ans++;
pos[++k]=u;
vis[u]=;
for(int i=;i<=n;i++)
{
if(g[u][i])
{
if(!dnf[i])
{
tarjan(i);
low[u]=min(low[u],low[i]);
}
else
{
if(vis[i]) low[u]=min(dnf[u],low[i]);
}
}
}
int cnt;
if(dnf[u]==low[u])
{
printf("Case #%d: ",++num);
do
{
cnt=pos[k--];
printf("%d ",cnt);
vis[cnt]=;
}while(cnt!=u);
printf("\n");
}
}
int main()
{
scanf("%d%d",&n,&m);
memset(g,,sizeof(g));
memset(dnf,,sizeof(dnf));
memset(low,,sizeof(low));
memset(pos,,sizeof(pos));
for(int i=;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
g[x][y]=;
}
printf("\n\n");
tarjan();
printf("************************\n");
printf("The number of the strongly connected components: %d\n",num);
printf("************************\n");
for(int i=;i<=n;i++)
{
printf("dnf[%d]:%d low[%d]:%d\n",i,dnf[i],i,low[i]);
}
return ;
}
/*
8 12
1 3
1 2
1 8
8 7
7 1
3 7
2 4
4 1
3 4
3 5
4 6
5 6
*/

最新文章

  1. RecyclerView 滑动检测 (上滑 up)(下滑 down)(顶部 top)(底部 bottom)
  2. js中对象使用
  3. easyui-datagrid 的loader属性用法
  4. PetaPoco入门(二)
  5. ahjesus不断完善的js小&quot;内裤&quot;
  6. vmdk虚拟机转换为OVF模板,导入esxi
  7. winform自动添加同级目录下可执行文件的快捷方式到右键菜单中
  8. &lt;六&gt;面向对象分析之UML核心元素之业务实体
  9. 模板引擎:Velocity&amp;FreeMarker(转)
  10. MyBatis(3.2.3) - Passing multiple input parameters
  11. android listview 使用checkbox问题
  12. 什么是NSTimer
  13. If I were you
  14. 一道面试题引发的思考(C#值类型和引用类型)
  15. &#39;Attempt to create two animations for cell&#39; iOS
  16. 引擎设计跟踪 地形LOD的改进
  17. Go指针相关
  18. 7-10 守卫棋盘 uva11214
  19. 【BZOJ2329/2209】[HNOI2011]括号修复/[Jsoi2011]括号序列 Splay
  20. &lt;转&gt;cocos2d-x学习笔记(五)仿真树叶飘落效果的实现(精灵旋转、翻转、钟摆运动等综合运用)

热门文章

  1. readb(), readw(), readl(),writeb(), writew(), writel() 宏函数
  2. bzoj 1040 1040: [ZJOI2008]骑士
  3. php通过shell调用Hadoop的方法
  4. arcmap 设置线段的不同颜色(及其它转化)
  5. mfc 链接 access 2007 数据库
  6. 10.29 工作笔记 ndk编译C++,提示找不到头文件(ndk-build error: string: No such file or directory)
  7. 浅谈 trie树 及事实上现
  8. 图文介绍MyEclipse (2015) 中创建简单的Maven项目的步骤(用于生成可运行jar文件)
  9. poj_2352树状数组
  10. django 笔记9 分页知识整理