P3388 【模板】割点
2017-03-19 10:05
134 查看
https://www.luogu.org/problem/show?pid=3388#sub
#include<iostream> #include<cstring> #include<cstdio> #include<string> #include<algorithm> #include<queue> #include<vector> using namespace std; int dfn[100009],low[100009],dfs_num=0,n,m,cnt=0,root; int num[200009],nxt[200009],head[100009]; bool flag[100009]; void dfs(int cur,int father)//cur为当前点,father为当前结点的父亲 { int child=0; dfn[cur]=++dfs_num; low[cur]=dfs_num; for(int i=head[cur];i;i=nxt[i]) { int k=num[i]; if(!dfn[k]) { child++; dfs(k,cur); low[cur]=min(low[cur],low[k]); if(cur!=root&&low[k]>=dfn[cur]) flag[cur]=true;//如果当前节点不是根节点, //那么如果它的儿子中只要有一个满足low值比它的num值小,那么当前点是一个割点 if(cur==root&&child>=2) flag[cur]=true;//如果当前节点是根节点,且有两个及以上儿子节点(dfs中的儿子节点), //那么也可以确定是割点 } else { 4000 if(k!=father) low[cur]=min(low[cur],dfn[k]);//dfn[k]不能改 } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); num[++cnt]=y; nxt[cnt]=head[x]; head[x]=cnt; num[++cnt]=x; nxt[cnt]=head[y]; head[y]=cnt; } for(int i=1;i<=n;i++) { if(!dfn[i]){ root=i; dfs(i,root); } } int ans=0; for(int i=1;i<=n;i++) if(flag[i]) ans++; printf("%d\n",ans); for(int i=1;i<=n;i++) if(flag[i]) printf("%d ",i); return 0; }
相关文章推荐
- 洛谷P3388 【模板】割点(割顶)(tarjan求割点)
- 洛谷P3388 【模板】割点
- 割点 洛谷P3388 【模板】割点(割顶) 学习板子
- 洛谷P3388 【模板】割点(割顶)
- 洛谷P3388 【模板】割点(割顶)
- P3388 【模板】割点(割顶)
- P3388 【模板】割点(割顶)
- 洛谷—— P3388 【模板】割点(割顶)
- DataView,Repeater,模板
- phpcms 默认模板的会员登陆位置
- 模板2
- [应用模板]HTML5颜色选择
- Eclipse Java注释模板设置详解
- 字典树模板
- 函数模板
- hdu 2544 最短路(Dijkstra模板)
- java 通过模板导出excel
- 寒假刷题——补模板——写新题
- 使用poi操作模板文件重新生成新的word表单文件
- C++之函数模板