Kosaraju求强连通分量,缩点
2018-03-11 19:37
211 查看
作用
只要两边dfs,相比于用tarjan求强连通分量,kosaraju算法还可以顺便求出强连通分量的拓扑序,有利于之后的运算.实现方法
首先以任意一点开始dfs,并记录下搜索的后序遍历,之后将所有边反向,每次从没有搜过的点中选择后序遍历最大的搜索,此次搜到的点均与该点属于同一个强连通分量,直到所有点都被搜到过停止,可以发现越先求出的强连通分量,拓扑序越小.例题(poj 2186)
题意
给出一副有向图,问有几个点是所有点都可以走到的.做法
不难发现如果点i符合题意,那么有且仅有点i所在的强连通分量符合题意,还可以发现如果答案非零,则点i所在的强连通分量的拓扑序最大,因此可以用kosaraju算法求出拓扑序最大的,再检验是不是符合题意.代码
#include<iostream> #include<cstdio> #include<cstring> #define N 10010 #define M 50010 using namespace std; int n,m,first ,bb,a[M],b[M],tim ,tt,lt,ans,last,an; bool vis ; struct Bn { int to,next; } bn[M]; inline void add(int u,int v) { bb++; bn[bb].to=v; bn[bb].next=first[u]; first[u]=bb; } void dfs(int now) { vis[now]=1; int p,q; for(p=first[now]; p!=-1; p=bn[p].next) 4000 { if(!vis[bn[p].to]) dfs(bn[p].to); } tim[++tt]=now; } void Dfs(int now) { ans++; vis[now]=1; int p,q; for(p=first[now]; p!=-1; p=bn[p].next) { if(vis[bn[p].to]) continue; Dfs(bn[p].to); } } void df(int now) { an++; vis[now]=1; int p,q; for(p=first[now];p!=-1;p=bn[p].next) { if(!vis[bn[p].to]) df(bn[p].to); } } int main() { memset(first,-1,sizeof(first)); int i,j,p,q; cin>>n>>m; for(i=1; i<=m; i++) { scanf("%d%d",&p,&q); add(p,q); a[i]=p,b[i]=q; } for(i=1;i<=n;i++) { if(!vis[i]) dfs(i); } memset(first,-1,sizeof(first)); bb=0; for(i=1; i<=m; i++) { add(b[i],a[i]); } memset(vis,0,sizeof(vis)); for(i=n;i>=1;i--) { if(vis[tim[i]]) continue; ans=0; Dfs(tim[i]); last=tim[i]; } memset(vis,0,sizeof(vis)); df(last); if(an!=n) { puts("0"); return 0; } cout<<ans; }
相关文章推荐
- HDU 2242 连通分量缩点+树形dp
- srm 299 div2 1000(强连通分量缩点,拓扑)
- 强连通分量Kosaraju、Tarjan【模板】
- poj 2186 Popular Cows(Tarjan,强连通分量缩点)
- tyvj 1111 舞会 有向图强连通分量 Kosaraju模板 tarjan模板
- The Bottom of a Graph 强连通分量 缩点后 那些点的出度为0
- 【POJ1236】Network of Schools 强联通分量缩点(本文kosaraju)
- UVA 11324 The Largest Clique (强连通分量缩点,图DP)
- 【强联通分量缩点】【搜索】bzoj2208 [Jsoi2010]连通数
- 【日常学习】【强连通分量tarjan缩点】codevs1611 抢掠计划题解
- 强连通分量(缩点+求出入为0的点的个数)HDU 2767 Proving Equivalences
- 图论复习之强连通分量以及缩点—Tarjan算法
- 训练赛 Grouping(强连通分量缩点 + DAG求最长路)
- Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法
- POJ2186 (强连通分量缩点后出度为0的分量内点个数)
- 强连通分量——tarjan ->缩点
- 强连通分量及缩点tarjan算法解析@
- 51nod 1456 小K的技术(Tarjan强连通分量缩点,并查集)
- 强连通分量与缩点(Tarjan算法)(洛谷P3387)
- 2017 乌鲁木齐赛区网络赛 Islands(【点强连通问题】【缩点+点强连通分量】)