Tarjin算法求桥和割点模板
来源:互联网 发布:cocos2dx mac环境搭建 编辑:程序博客网 时间:2024/06/05 00:26
定义
存在于无向图中。
割点:删除此点使得图中连通块数量增加。
桥(割边):删除此边使得图中连通块数量增加——割点于割点之间的直接连边为桥。
判断割点方法:
1.u为树根,且u有多于一个子树。
2.u不为树根,且存在(u,v)为树枝边(或称父子边,即u为v在搜索树中的父亲),使得dfn(u)<=low(v)。
也就是u的子树中的v点无法到达u之前的点,所以去掉u点就是两个连通分支,所以u为割点。
判断桥的方法:
一条边(u,v)是桥,当且仅当(u,v)为树枝边(即非负边),且满足dfn(u)< low(v)(前提是其没有重边)。
也就是,u的儿子v之间只有一条边(前提是无重边),且v点只能到v点到不了v点前,所以去掉(u,v)边就是两个连通分支,所以(u,v)为桥。
注意:找桥的时候,要注意看有没有重边.有重边,则不是桥。
代码
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;int n,m,ru,rv,tot,cnt,num,chl,root,ans;int first[500010],nxt[500010],dfn[500010],low[500010],siz[500010],sccno[500010],stak[500010];bool flag[500010],flag1[500010];//割点,桥 struct edge{ int u,v;}l[1000010];void build(int f,int t){ l[++tot]=(edge){f,t}; nxt[tot]=first[f]; first[f]=tot;}void dfs(int k){ dfn[k]=low[k]=++tot; stak[++num]=k; chl=0; for(int i=first[k];i!=-1;i=nxt[i]) { int x=l[i].v; if(!dfn[x]) { chl++;//记录子节点数,仅对根节点有意义 dfs(x); low[k]=min(low[k],low[x]); if((k!=root&&low[x]>=dfn[k])||(k==root&&chl>1)) { if(!flag[k]) ans++; flag[k]=1; } if(low[x]>dfn[k])//前提没有重边,有重边则不为bridge flag1[i]=1; } else if(!sccno[x]) low[k]=min(low[k],dfn[x]); } if(low[k]==dfn[k]) { cnt++; while(1) { sccno[stak[num--]]=cnt; siz[cnt]++; if(stak[num+1]==k) break; } }}int main(){ memset(first,-1,sizeof(first)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d",&ru,&rv); build(ru,rv); build(rv,ru); } tot=0; for(int i=1;i<=n;i++) { if(!dfn[i]) { root=i; dfs(i); } } printf("%d\n",ans); for(int i=1;i<=n;i++) if(flag[i]) printf("%d ",i); return 0;}
阅读全文
1 0
- Tarjin算法求桥和割点模板
- Tarjan算法求桥和割点
- 割点和桥模板
- 割点和桥模板
- 求桥和割点的Tarjan算法
- 割点,桥模板
- 割点、桥模板
- poj1144 求图的割点--模板
- tarjan算法--求无向图的割点和桥
- tarjan算法--求无向图的割点和桥
- Tarjan算法--求无向图的割点和桥
- 割点和桥---Tarjan算法
- 割点算法模板(Cut-vertex)
- tarjan最小割点算法模板
- 求无向图的割点和桥
- 求无向图的割点和桥
- 求无向图的 割点和桥 【模版】
- Tarjan求无向图桥和割点
- Git查看、删除、重命名远程分支和tag
- 求不大于n的正整数的阶乘的和
- 文件上传方式2
- 不同用户设置ssh信任关系不输入密码执行scp 命令
- [译]Multi-Gradient shape
- Tarjin算法求桥和割点模板
- Python基于pandas的数据处理
- CoordinatorLayout 上的一些布局技巧
- Java-MongoDB入门级小程序,方便直接上手使用
- 域名解析相关备忘
- greendao的使用
- 求100-200之间素数的三种方法
- ORM系列之三:Dapper
- 2017年第9届中国(江苏)国际农业机械展览会会刊(参展商名录)