Tarjan求割点
来源:互联网 发布:星际争霸2和lol知乎 编辑:程序博客网 时间:2024/05/24 01:22
模板题:luogu3388
题面:
给出一个n个点,m条边的无向图,求图的割点。
思路:
对于每一个没有访问过(dfn[n]==0)的顶点,用tarjan算法以此点为根生成一颗dfs树
low记录与该节点连接的dfs序最小的节点的dfs序(时间戳),dfn则记录该节点的dfs序。
当第一个节点回溯到其父节点时,若low[son]>dfn[father],说明该子节点不与任何在以该子节点为根的子树外的节点连接,则该父节点一定为割点;若low[son]
...int son=0, back=0;void tarjan(int u, int rt){ dfn[u]=++tim; low[u]=tim; instack[u]=true; sta.push(u); for(int i=front[u]; i>0; i=e[i].next) { int v=e[i].v; fa[v] = u; if(u==rt) son++; if(v==rt && fa[u]!=rt) back++; //更新son和back if(dfn[v]==0) { fa[v]=u; tarjan(v, rt); low[u]=min(low[u], low[v]); if(low[v]>=dfn[u] && u!=rt && inq[u]==false) //如果一个非根节点满足low[father]>=dfn[son]且之前没有入队 { q.push(u); inq[u] = true; ans++; } } if(instack[u]==true) low[u]=min(low[u], dfn[v]); } if(u==rt && (son-back<=1 || son<=1)) iscut[rt]=false; //判断根节点是否为割点 instack[u]=false; sta.pop();}int main(){ ... for(int i=1; i<=n; i++) { if(dfn[i]!=0) continue; iscut[i]=true; son=0, back=0; tarjan(i, i); if(iscut[i]==false || inq[i]==true) continue; //如果根节点不是割点或者根节点已经入队, 则跳过 inq[i] = true; q.push(i); ans++; break; } ...}
阅读全文
0 0
- tarjan求割点
- Tarjan求割点
- Tarjan求割点
- tarjan求割点 poj 1144
- network tarjan算法求割点
- poj1144-tarjan求割点
- tarjan求割点HOJ1007SPF
- poj1144 tarjan求割点
- poj 1523 tarjan求割点
- POJ1523 SPF 【求割点Tarjan】
- poj1144 - tarjan求割点
- [poj1144 Network]tarjan求割点
- POJ 1523 Tarjan求割点
- BZOJ 2730 Tarjan求割点
- POJ 1523 Tarjan求割点
- Tarjan求割点板子
- Hrbust1494网络 tarjan求割点
- uva315 Network 【tarjan-求割点】
- Ubuntu17.04安装wps
- $match
- 注解的定义以及获取注解里面的方法,变量
- 洛谷1137 旅行计划
- label statement
- Tarjan求割点
- [二分答案 DP检验 几何] BalkanOI 2017. Cruise
- 系统限制
- js日期格式化
- Sublime Text3自动保存的功能(失去焦点自动保存)
- solr7在tomcat上的部署
- [线段树 哈希] BalkanOI 2016. Haker
- CentOS 6.5 LVS+KeepAlived(DR模式)搭建高可用负载均衡集群
- $project