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中,若两顶点间至 ...
随机推荐
- Linux中yum、rpm、configure使用介绍
安装程序命令介绍 安装包选择策略:能上外网:yum方式.绿色方式->不能上外网:rpm方式.configure方式 1.yum命令yum安装包时,会包所依赖的包也会安装到系统,将源换成163的源 ...
- 后台安装 SQL Server 无人值守 安装
(开头闲淡)项目需要必须安装SQL的,查了很久,断断续续用了各种方法,今天终于用了正确的姿(xia)势(mo)弄成了. 最开始用的方法是调用Win的API模拟鼠标操作安装的,嗯,虽然勉强可以,就是有些 ...
- 剑指offer44 扑克牌顺序
注意一个边界条件:必须是连续的,如果前后两个数是一样的也不满足条件 class Solution { public: bool IsContinuous( vector<int> numb ...
- 如何在Mac OS X中开启或关闭显示隐藏文件命令
打开终端,输入:defaults write com.apple.finder AppleShowAllFiles -bool true 此命令显示隐藏文件defaults write com.app ...
- js parse_url 引发的
原文链接:https://www.w3.org/TR/2011/WD-html5-20110525/origin-0.html 这里只是做下记录: 5.3 Origin — HTML5 li, dd ...
- Bootstrap历练实例:超小的按钮
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...
- viewDidLoad、loadView
一.loadView永远不要主动调用这个函数.view controller会在view的property被请求并且当前view值为nil时调用这个函数.如果你手动创建view,你应该重载这个函数,且 ...
- vue 封装组件上传img
var _uploadTemplate = '<div>'+ '<input type="file" name="file" v-on:cha ...
- 【状态压缩 meet in middle】poj3139Balancing the Scale
数组溢出真是可怕的事情 Description You are given a strange scale (see the figure below), and you are wondering ...
- 初涉平衡树「treap」
treap:一种平衡的二叉搜索树 什么是treap(带旋) treap=tree+heap,这大家都知道.因为二叉搜索树(BST)非常容易被卡成一条链而影响效率,所以我们需要一种更加平衡的树形结构,从 ...