不赘叙了,问就是找图里的割点。

运用tarjan算法,维护dfn[] 和 low[] 两个数组,

先说结论吧,就是:

一个割点,他的所有子节点的low值都会大于等于该割点的dfn值

也即,对于边(u,v),存在有low[v]>=dfn[u],则u为割点。

分析如下:

分为根节点和非根节点来讨论:

1.根节点,很显然,满足其子树>=2则该根节点为割点,因为去掉了这个根节点,其子树也就互不相连,该图就不是连通图了。

(注意子树的定义:互不连通,无返回根节点的路)

2.非根节点,就得用上面所说的结论了,

因为,对于u点是否是割点,从边(u,v)考虑,

如果所有的v能够到达u的祖先,那么low[v]就会变成dfn[u的祖先节点],则一定会比dfn[u]小,此时去掉u仍是连通图。

也即low[v]<dfn[u],则u不是割点。

反之,若存在low[v]>=dfn[u]也就意味着,子节点v无法到达u的祖先节点,那么u就是割点

看图理解吧,对于非根节点2,

先说红边(2,5)和节点5都不存在的情况,对于节点2的子节点3,4可以到达节点2的祖先,也就是其low值都会比dfn[2]小(会变成dfn[1])

也就是说,对于节点2,不符合存在low[子节点]>=dfn[割点]。

那么节点2就不是割点(本身也可以看出,去掉节点2,图仍然是连通图)

如果红边(2,5)和节点5存在,那么子节点5无法到达节点2的祖先,那么low[5]就会大于dfn[2],

也就是说,对于节点2,符合存在low[子节点]>=dfn[割点]。

那么节点2就是割点,(本身也可以看出,去掉节点2,图就不再是连通图,节点5孤立)

 下面上代码:(用的vector存图)

void tarjan(int u,int r)//当前搜索树节点为u,根节点为r
{dfn[u]=low[u]=++cnt;int child=0;//当前子树的数量 for(int i=0;i<mp[u].size();++i){int v=mp[u][i];if(!dfn[v]){tarjan(v,r);low[u]=min(low[u],low[v]);if(low[v]>=dfn[u]&&u!=r)vc.push_back(u);//存在 low[v]>=dfn[u] 且 不是根节点 ,则是割点 if(u==r)child++;}low[u]=min(low[u],dfn[v]);}if(child>=2&&u==r)vc.push_back(u);//根节点 且 子树>=2 ,则是割点
}

例题:https://www.luogu.com.cn/problem/P3388

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
#define N 20210
#define mt(x) memset(x,0,sizeof x)
typedef long long ll;
void cn(ll x){cout<<x<<endl;}
void cs(string x){cout<<x<<endl;}
int n,m;
vector<int>vc,mp[N];
int dfn[N],low[N],vis[N],cnt;
//vis防止重复选择节点
void init()
{cin>>n>>m;for(int i=1;i<=m;++i){int x,y;cin>>x>>y;mp[x].push_back(y);mp[y].push_back(x);//无向图 }mt(vis);
}
void tarjan(int u,int r)
{dfn[u]=low[u]=++cnt;int child=0;//当前子树的数量 for(int i=0;i<mp[u].size();++i){int v=mp[u][i];if(!dfn[v]){tarjan(v,r);low[u]=min(low[u],low[v]);if(low[v]>=dfn[u]&&u!=r&&!vis[u]){vis[u]=1;vc.push_back(u);}if(u==r)child++;}low[u]=min(low[u],dfn[v]);
//      if(low[v]>=dfn[u]&&u!=r&&!vis[u])
//      {
//          vis[u]=1;
//          vc.push_back(u);
//      }
//      if(u==r)child++;
//      写在如上位置不具有子节点判断的意思 }if(child>=2&&u==r&&!vis[u]){vis[u]=1;vc.push_back(u);}
}
void solve()
{init();for(int i=1;i<=n;++i)if(!dfn[i])tarjan(i,i);sort(vc.begin(),vc.begin()+vc.size());cn(vc.size());for(int i=0;i<vc.size();++i){if(i)cout<<' '; cout<<vc[i];}cs("");
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);solve();return 0;
}

tarjan——割点相关推荐

  1. BZOJ1123BLO Tarjan割点+乘法原理+dfs

    BZOJ1123 BLO : Tarjan割点+乘法原理+dfs Description 给定一张无向图,求每个点被封锁之后有多少个有序点对(x,y)(x!=y,1<=x,y<=n)满足x ...

  2. 【学习/模板】tarjan割点

    P3388 [模板]割点(割顶) tarjan爷爷造福世界 割点适用于无向图, 所以low数组定义发生变化,不再是最早能追溯到的栈中节点编号(因为是无向边,没有意义), 而是一直往下走能绕到的最早的割 ...

  3. 【UOJ#67】新年的毒瘤 Tarjan 割点

    #67. 新年的毒瘤 UOJ直接黏贴会炸...    还是戳这里吧: http://uoj.ac/problem/67#tab-statement Solution 看到这题的标签就进来看了一眼. 想 ...

  4. jzoj3896-战争游戏【tarjan,割点,点双联通分量】

    正题 题目大意 求每个点是多少个点对之间路径的必经点. 解题思路 首先若一个点是在点不是割点,那么答案就是n−1n-1n−1,因为这个点不是除了它自己以为任何点对的必经点. 之后我们记录每个可以割掉的 ...

  5. POJ 3713 枚举 + Tarjan 割点

    题意 传送门 POJ 3713 题解 白书里归到最大流最小割,Emmmm没有找到复杂度比较低的方法.虽然通道节点不相交可以转化为节点容量为 1,通过拆成 2 个节点并连边转化成最大流问题,但要枚举每一 ...

  6. [Tarjan][割点] 洛谷 P3469 BLO-Blockade

    题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每两个城镇之间至多只有一条直接连接的道路.人们可以从任意一 ...

  7. 【POJ2117】Electricity [tarjan 割点]

    2117 -- Electricity 一个无向图 去掉一个点后最多能被分为多少个部分 输入要注意是n m同时为0才停.... n,m可能有一个为零 别问我为什么知道... 其实每太弄懂.....再看 ...

  8. BZOJ1123BLO Tarjan割点

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2302  Solved: 1138 [Submit][Stat ...

  9. Tarjan相关最全(附训练题和答案)

    Tarjan相关最全(附训练题和答案) 算法思想 Tarjan 强连通分量 割点 割桥 缩点 Kosaraju Garbow 训练 POJ2186 POJ1236 POJ2375 Luogu P338 ...

最新文章

  1. Vue-Resource请求PHP数据失败的原因
  2. python提高办公效率-用Python的这3个优点,让工作效率提升一倍
  3. Android全屏与透明状态栏
  4. short 类型的大小为( )个字节。_2008-2012,张一鸣在豆瓣书影音为字节跳动埋下的5个彩蛋...
  5. IOCP 浅析与实例
  6. 【转】使用 vim + ctags + cscope + taglist 阅读源码
  7. 产品运行所需的信息检索失败_禁煤后用什么替代锅炉?看看三种热源运行费用对比就知道了...
  8. CentOS 7 Apache服务的安装与配置(转)
  9. MyBatis学习总结(22)——Mybatis自增长ID获取
  10. 3 css 奖品出现弹出动画_10 个 GitHub 上超火的 CSS 奇技淫巧项目,找到写 CSS 的灵感!...
  11. 什么是Java Marker Interface(标记接口) 1
  12. 公司技术部的罗强月薪10000,要跳槽
  13. 夫妻俩70岁积蓄70万元,俩人退休金8000元,还需要理财吗?
  14. 景观生态学概述[转载]
  15. 自动驾驶1-6: 推动决策和行动Driving Decisions and Actions
  16. sys.argv学习,通过运行py脚本,手动传入参数
  17. 数学建模各种软件对比(MATLAB/Lingo/SAS/SPSS)
  18. DB2 执行SQL报错: DB2 SQL Error: SQLCODE=-1585, SQLSTATE=54048
  19. html5在线聊天一对一,纯js网页在线聊天对话插件(原创)
  20. 修改apt-get服务器,云服务器使用sudo apt-get update 失败的原因及解决方法(unubtu下)...

热门文章

  1. 计算机如何区分程序和数据,计算机如何区分数据和指令?
  2. 2017年6月历史文章汇总
  3. java xca,keytool 错误: java.lang.Exception: 所输入的不是 X.509 证书
  4. 阅读笔记:软件需求十步走(三)
  5. SEO全攻略:中小企业新站SEO优化应该怎么做_刘小虎SEO博客
  6. 2-1输入两个整数num1和num2,计算并输出他们的和、差、积、商与余数
  7. 基于微信小程序的校园二手物品交易平台的设计与实现-计算机毕业设计源码+LW文档
  8. 使用以太坊和 Metamask 再也不需要输入密码
  9. 锂离子电池被动均衡深度理解
  10. XGBoost和时间序列