KS求有向图强连通分量模板
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; int n,m;
const int maxn=1e5+;
const int maxm=*maxn;
struct nodeg
{
int to;
int nxt;
}eg[maxm];
int headg[maxn];
int headgr[maxn];
struct nodegr
{
int to;
int nxt;
}egr[maxn];
int totg;
int totgr;
int id=;
int num[maxn];
bool vis[maxn];
int root;
int cnt;
void init()
{
memset(headg,-,sizeof(headg));
memset(headgr,-,sizeof(headgr));
totg=;
totgr=;
cnt=;
}
void addg(int u,int v)
{
eg[totg].to=v;
eg[totg].nxt=headg[u];
headg[u]=totg++;
}
void addgr(int u,int v)
{
egr[totgr].to=v;
egr[totgr].nxt=headgr[u];
headgr[u]=totgr++;
}
vector<int> scc[maxn];
void DFS(int u)
{
vis[u]=true;
for(int i=headg[u];i!=-;i=eg[i].nxt)
{
int v=eg[i].to;
if(!vis[v])
{
DFS(v);
}
}
num[++id]=u;
}
void RDFS(int u,int k)
{
vis[u]=true;
scc[k].push_back(u);
for(int i=headgr[u];i!=-;i=egr[i].nxt)
{
int v=egr[i].to;
if(!vis[v])
{
RDFS(v,k);
}
}
}
void SCC()
{
memset(vis,false,sizeof(vis));
for(int i=;i<=n;i++)
{
if(!vis[i])
{
DFS(i);
}
}
memset(vis,false,sizeof(vis));
for(int i=;i<=n;i++)
{
scc[i].clear();
}
cnt=;
for(int i=id;i>=;i--)
{
if(!vis[num[i]]) RDFS(num[i],++cnt);
}
}
void printSC()
{
for(int i=;i<=cnt;i++)
{
int sz=scc[i].size();
for(int j=;j<sz;j++)
printf("%d ",scc[i][j]);
puts("");
}
} int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
int u,v;
for(int i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
addg(u,v);
addgr(v,u);
}
SCC();
printSC();
} return ;
}
Kosaraju-Sharir算法
http://www.cnblogs.com/llhthinker/p/4954082.html
KS求有向图强连通分量模板的更多相关文章
- Tarjan算法求有向图强连通分量并缩点
// Tarjan算法求有向图强连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> #inc ...
- Tarjan求有向图强连通分量 BY:优少
Tarjan算法:一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法. 定义给出之后,让我们进入算法的学习... [情境引入] [HAOI2006受欢迎的牛] 题目描述: 每头 ...
- POJ3180(有向图强连通分量结点数>=2的个数)
The Cow Prom Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1451 Accepted: 922 Descr ...
- 有向图强连通分量的Tarjan算法及模板
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强联通(strongly connected),如果有向图G的每两个顶点都强联通,称有向图G是一个强联通图.非强联通图有向 ...
- tarjan求强连通分量模板
什么是强连通分量? 百度百科 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(stro ...
- 有向图强连通分量的Tarjan算法
有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...
- 有向图强连通分量 Tarjan算法
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
- 【转】有向图强连通分量的Tarjan算法
原文地址:https://www.byvoid.com/blog/scc-tarjan/ [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly con ...
- 图的连通性:有向图强连通分量-Tarjan算法
参考资料:http://blog.csdn.net/lezg_bkbj/article/details/11538359 上面的资料,把强连通讲的很好很清楚,值得学习. 在一个有向图G中,若两顶点间至 ...
随机推荐
- iOS图片目录批量复制到android图片目录
复制shell脚本 #!/bin/bash for i in `ls` do for imgname in `ls $i | grep '^WM.*'` do echo $imgname cp $i/ ...
- java中的堆与栈
Java 中的堆和栈 Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配 . 当在一段代码块定义一个变量时,Java就在栈中 ...
- html5文本超过指定行数隐藏显示省略号
这个很简单,直接贴代码就好了 HTML <span class="name">博客园是一个面向开发者的知识分享社区.自创建以来,博客园一直致力并专注于为开发者打造一个纯 ...
- Python 解压序列、可迭代对象并赋值给多个变量
Python数据结构和类型 1.1 解压序列赋值给多个变量 现在有一个包含N个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给N个变量? 解决思路:先通过简单的解压赋值给多个变量,前提是变量的数 ...
- win7上安装虚拟机并上网
一.安装Workstation Pro 二.下载CentOS-7-x86_64-DVD-1511.iso包 三.创建新的虚拟机,按照向导安装即可 四.使用cd /etc/sysconfig/netwo ...
- dubbo 多连接,多线程池.
1. consumer 多连接 Dubbo protocol options: <dubbo:protocolname=“dubbo” port=“9090” server=“netty” cl ...
- 【JavaScript】两种常见JS面向对象写法
基于构造函数 function Circle(r) { this.r = r; } Circle.PI = 3.14159; Circle.prototype.area = function() { ...
- Fortran学习笔记5(数组Array)
数组的声明方式 一维数组 二维数组 多维数组 数组索引值的改变 自定义类型的数组定义 对数组内容的设置 利用隐含式循环设置数组初值 对整个数组操作 对部分数组的操作 where函数 Forall函数 ...
- CONTEST1001 题解
PROBLEM A 分析 这个题属于非常基础的输出问题,一般来说见到这种题可以直接复制粘贴即可. 讲解 没有什么详细说明的直接复制粘贴即可.这样不容易出错. 代码 #include <stdio ...
- CPU 基础术语总结
CPU CPU为 Central Processing Unit 的缩写.是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Control Unit).它的功能主要是解释计算机 ...