给出一个n个点,m条边的无向图,求图的割点。


u是cut vertex的两个条件:

1.存在v使v及其所有后代没有反向边连回u的祖先

2.u是根且有两个以上子节点

dfs一遍

low[u]是u及其后代所能连回的最早祖先

没有dfn[v]就dfs(v),然后用low[v]更新low[u](v是u的后代)

否则v不是fa就用dfn[v]更新low[u](u可以连回v)【不能用low[v],因为low[v]包含v的后代能连回】

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1e5+,M=1e5+,INF=1e9+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x;
}
int n=,m,u,v;
struct edge{
int v,ne;
}e[M<<];
int h[N],cnt=;
inline void ins(int u,int v){
cnt++;
e[cnt].v=v;e[cnt].ne=h[u];h[u]=cnt;
cnt++;
e[cnt].v=u;e[cnt].ne=h[v];h[v]=cnt;
}
int dfn[N],low[N],dfc=,iscut[N];
void dfs(int u,int fa){
dfn[u]=low[u]=++dfc;
int child=;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].v;
if(!dfn[v]){
child++;
dfs(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]) iscut[u]=;
}else if(dfn[v]<dfn[u]&&v!=fa) low[u]=min(low[u],dfn[v]);
}
if(fa==&&child==) iscut[u]=;
}
int main(){
n=read();m=read();
for(int i=;i<=m;i++){u=read();v=read();ins(u,v);}
for(int i=;i<=n;i++) if(!dfn[i]) dfs(i,); int ans=;
for(int i=;i<=n;i++) if(iscut[i]) ans++;
printf("%d\n",ans);
for(int i=;i<=n;i++) if(iscut[i]) printf("%d ",i);
}

最新文章

  1. python获取命令行输出结果
  2. 自定义样式RatingBar的使用
  3. nginx日志分析利器GoAccess
  4. Res_Orders_01
  5. SQL Server 内存中OLTP内部机制概述(二)
  6. c# 获取路径的几种方法
  7. [置顶] 《算法导论》习题解答搬运&amp;&amp;学习笔记 索引目录
  8. 8天学通MongoDB——第四天 索引操作
  9. (转)19个必须知道的Visual Studio快捷键
  10. 读取excel出现空值
  11. js 冒泡排序
  12. div 隐藏显示各种例子
  13. V先生:信息流广告标题党必备的500个热词
  14. 用for循环打印九九乘法表(for嵌套循环)
  15. SDOI2017 Round1 简要题解
  16. easyui combotree combobox 使用例子
  17. C++ namespace命名空间
  18. php高效遍历文件夹、高效读取文件
  19. goldendict
  20. Scala隐式转换和隐式参数

热门文章

  1. Mule入门基础
  2. 【转】mysql_fetch_row , mysql_fetch_array , mysql_fetch_assoc 的区别
  3. ProxyPattern
  4. Ant_build.xml的最完整解释
  5. 转:Java Web应用中调优线程池的重要性
  6. Linux下三个密码生成工具
  7. 基于mybatis-generator-core 1.3.5项目的修订版以及源码剖析
  8. 如何在Mac OSX系统下安装Tomcat
  9. JavaScript变换表格边框颜色
  10. js 自动插入分号