强连通分量+poj2186
2024-08-30 06:33:46
强连通分量:两个点能够互相连通。
算法分解:第一步。正向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;
}
最新文章
- dom 的介绍
- iOS之TimeLine(时间轴)的实现
- Metaio在Unity3D中报错 Start: failed to load tracking configuration: TrackingConfigGenerated.xml 解决方法
- uva 10817(状压dp)
- c++11中的static
- 使用TinkPHP实现品字形布局
- Python:异常处理
- webapp新体验Rem实现移动端网页适配详解资源
- Delphi笔记(GL_Scene安装及简单使用)
- 利用Adapter对象将数据填充到DataTable(或DataSet)的例子
- wamp的安装使用(转)
- SpringMVC搭建+实例
- PyCharm 教程
- jQuery 事件对象的属性
- CSS3滚动条美化,CSS3滚动条皮肤
- mac 进程和线程工具
- iOS静态库.a总结(2017.1.24增加脚本打包方法)
- bzoj1503 Splay 维护名次数,支持删除
- (转)不通过web.config在运行时注册httpmodules
- NOR FLASH驱动程序
热门文章
- Django之使用celery异步完成发送验证码
- (5) openssl speed(测试算法性能)和openssl rand(生成随机数)
- php 后端规范
- LINUX:关于Redis集群搭建 、和搭建项目中遇到的问题
- Android开发——获取微信聊天记录(后台秘密发邮件)
- Java学习之Math类理解
- vs2010 C# 如何将类做成DLL 再从另一个项目中使用这个类
- 大数据学习——Linux上常用软件安装
- There is no getter for property named &#39;id&#39; in class &#39;java.lang.String&#39;
- FZU1004-Number Triangle经典动归题,核心思路及代码优化