强连通分量:两个点能够互相连通。

算法分解:第一步。正向dfs全部顶点,并后序遍历

第二步,将边反向,从最大边dfs,构成强连通分量

标号最大的节点属于DAG头部,cmp存一个强连通分量的拓扑序。

poj2186

解就是拓扑后的最后一个强连通分量

#include<cstdio>
#include<algorithm>
#include<vector>
#include<iostream>
#include<cstring>
#include<string.h>
using namespace std;
#define MAX_V 10000
#define MAX_M 50000 int V,N,M;
int A[MAX_M],B[MAX_M];
vector<int> G[MAX_V];
vector<int> rG[MAX_V];
vector<int> vs;
bool used[MAX_V];
int cmp[MAX_V];
void add_edge(int from,int to){
G[from].push_back(to);
rG[to].push_back(from);
}
void dfs(int v){
used[v]=true;
for(int i=0;i<G[v].size();i++){
if(!used[G[v][i]]) dfs(G[v][i]);
}
vs.push_back(v);
}
void rdfs(int v,int k){
used[v]=true;
cmp[v]=k;
for(int i=0;i<rG[v].size();i++)
if(!used[rG[v][i]]) rdfs(rG[v][i],k);
}
int scc(){
memset(used,0,sizeof(used));
vs.clear();
for(int v = 0;v<V;v++){
if(!used[v]) dfs(v);
}
memset(used,0,sizeof(used));
int k=0;
for(int i=vs.size()-1;i>=0;i--)
if(!used[vs[i]]) rdfs(vs[i],k++);
return k;
}
void solve(){
V = N;
for(int i=0;i<M;i++)
add_edge(A[i]-1,B[i]-1);
int n=scc();
int u=0,num=0;
for(int v=0;v<V;v++)
if(cmp[v]==n-1){
u=v;
num++;
}
memset(used,0,sizeof(used));
rdfs(u,0);
for(int v=0;v<V;v++)
if(!used[v]){
num=0;
break;
}
printf("%d\n",num);
}
int main()
{
while(~scanf("%d%d",&N,&M)){
for(int i=0;i<M;i++) scanf("%d%d",&A[i],&B[i]);
solve();
}
return 0;
}

最新文章

  1. dom 的介绍
  2. iOS之TimeLine(时间轴)的实现
  3. Metaio在Unity3D中报错 Start: failed to load tracking configuration: TrackingConfigGenerated.xml 解决方法
  4. uva 10817(状压dp)
  5. c++11中的static
  6. 使用TinkPHP实现品字形布局
  7. Python:异常处理
  8. webapp新体验Rem实现移动端网页适配详解资源
  9. Delphi笔记(GL_Scene安装及简单使用)
  10. 利用Adapter对象将数据填充到DataTable(或DataSet)的例子
  11. wamp的安装使用(转)
  12. SpringMVC搭建+实例
  13. PyCharm 教程
  14. jQuery 事件对象的属性
  15. CSS3滚动条美化,CSS3滚动条皮肤
  16. mac 进程和线程工具
  17. iOS静态库.a总结(2017.1.24增加脚本打包方法)
  18. bzoj1503 Splay 维护名次数,支持删除
  19. (转)不通过web.config在运行时注册httpmodules
  20. NOR FLASH驱动程序

热门文章

  1. Django之使用celery异步完成发送验证码
  2. (5) openssl speed(测试算法性能)和openssl rand(生成随机数)
  3. php 后端规范
  4. LINUX:关于Redis集群搭建 、和搭建项目中遇到的问题
  5. Android开发——获取微信聊天记录(后台秘密发邮件)
  6. Java学习之Math类理解
  7. vs2010 C# 如何将类做成DLL 再从另一个项目中使用这个类
  8. 大数据学习——Linux上常用软件安装
  9. There is no getter for property named &#39;id&#39; in class &#39;java.lang.String&#39;
  10. FZU1004-Number Triangle经典动归题,核心思路及代码优化