题目背景

割点

题目描述

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

输入输出格式

输入格式:

第一行输入n,m

下面m行每行输入x,y表示x到y有一条边

输出格式:

第一行输出割点个数

第二行按照节点编号从小到大输出节点,用空格隔开

输入输出样例

输入样例#1:

6 7
1 2
1 3
1 4
2 5
3 5
4 5
5 6

输出样例#1:

1
5

说明

n,m均为100000

tarjan 图不一定联通!!!

思路

dfs求割点;

在DFS搜索树,我们可以发现有两类节点可以成为割点:

  1. 对根节点u,若其有两棵或两棵以上的子树,则该根结点u为割点;
  2. 对非叶子节点u(非根节点),若其子树的节点均没有指向u的祖先节点的回边,说明删除u之后,根结点与u的子树的节点不再连通;则节点u为割点。

2即n->v边中low[v]>=dfn[u];

代码实现

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=3e5;
 5 inline int min_(int x,int y){return x<y?x:y;}
 6 int n,m;
 7 int a,b;
 8 int h[maxn],hs,et[maxn],en[maxn];
 9 void add(int u,int v){
10     ++hs,et[hs]=v,en[hs]=h[u],h[u]=hs;
11     ++hs,et[hs]=u,en[hs]=h[v],h[v]=hs;
12 }
13 int s[maxn],ss;
14 int dfn[maxn],dfns,low[maxn],v[maxn];
15 void tarjan(int k,int f){
16     dfn[k]=low[k]=++dfns;
17     for(int i=h[k];i;i=en[i])
18     if(et[i]!=f){
19         if(dfn[et[i]]){
20             low[k]=min_(low[k],dfn[et[i]]);
21         }
22         else{
23             tarjan(et[i],k);
24             low[k]=min_(low[k],low[et[i]]);
25             if(low[et[i]]>=dfn[k]) ++v[k];
26         }
27     }
28     if(f&&v[k]) s[++ss]=k;
29     if(!f&&v[k]>1) s[++ss]=k;
30 }
31 int main(){
32     scanf("%d%d",&n,&m);
33     for(int i=1;i<=m;i++){
34         scanf("%d%d",&a,&b);
35         add(a,b);
36     }
37     for(int i=1;i<=n;i++){
38         if(!dfn[i]){
39             dfns=0;
40             tarjan(i,0);
41         }
42     }
43     sort(s+1,s+ss+1);
44     printf("%d\n",ss);
45     for(int i=1;i<=ss;i++) printf("%d ",s[i]);
46     putchar('\n');
47     return 0;
48 }

感谢;

http://www.cnblogs.com/en-heng/p/4002658.html

助我一A;

转载于:https://www.cnblogs.com/J-william/p/7044352.html

【模板】割点(割顶)相关推荐

  1. 洛谷 P3388 【模板】割点(割顶) 根+非根+dfn[]+low[]+不一样的Tarjan算法

    洛谷  P3388 [模板]割点(割顶)  根+非根+dfn[]+low[]+不一样的Tarjan算法 Tarjan算法,详见https://blog.csdn.net/mrcrack/article ...

  2. P3388 【模板】割点(割顶) 题解

    博客园同步 原题链接 简要题意: 给定一个图,求所有割点. 割点(割顶)的定义:去掉该点整个图不连通. 前置知识: 强连通分量的 Tarjan \texttt{Tarjan} Tarjan 求法. 不 ...

  3. UVA 315 :Network (无向图求割顶)

    题目链接 题意:求所给无向图中一共有多少个割顶 用的lrj训练指南P314的模板 #include<bits/stdc++.h> using namespace std; typedef ...

  4. 无向图的割顶、桥、BCC和eBCC相关

    几个例题代码待填 割顶:若去掉一个点和与这个点相连的边后,图不再连通,则这个点是割顶. ​ 求法:若节点\(u\)存在一棵子树\(v\)满足\(v\)中所有节点的回边都指向\(u\)及以下的节点(即\ ...

  5. 【BZOJ1123】[POI2008]BLO【割顶】

    [题目链接] 题意可见discuss. 用Tarjan求割顶,然后对割顶的所有子树求点对个数(前缀和扫一遍),最后把自身和其他点的答案加上. 没注意边,数组开小了. /* Pigonometry */ ...

  6. 洛谷P3388 【模板】割点(割顶)

    /*表示割点模板很难理解.... 但是呢,可以将整个图用深搜来一步步递归.. dfn[x]<=low[tmp] && x!=mr的点就++: 完毕.... PS:小心第一个节点. ...

  7. 【模板】 割点(割顶)

    神马网站的链接都可以啊~~~~ 模板题,无程序说明 Code: #include<bits/stdc++.h> #define rep(i,j,k) for(int i=j;i<=k ...

  8. P3388-[模板]割点(割顶)【tarjan】

    正题 题目大意 求所有割点 解题思路 跑tarjantarjantarjan,然后判断dfnx≤lowydfn_x\leq low_ydfnx​≤lowy​ codecodecode #include ...

  9. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

最新文章

  1. Powershell管理系列(五)修改AD账号属性
  2. 怎么把视频里的音乐提取出来
  3. 这样设置ae导出文件的时候m1还是能顶得住的,3分钟的事情渲染一个开场
  4. mysql怎么实现事务序列化_一文快速搞懂MySQL InnoDB事务ACID实现原理(转)
  5. 基于React开发范式的思考:写在Lesx发布之际
  6. 【转】职业生涯30年的规划(经典)
  7. mysql数据库事务的概念_如何理解数据库事务中的一致性的概念?
  8. python实现的 AWGN信道下QPSK调制信号的平均相位估计
  9. Java进制转换工具类
  10. Visio 下载,及密钥
  11. 在unity中,模型自动旋转
  12. 网页版在线使用PS网站源码
  13. ssm基于jsp的在线点餐系统 毕业设计源码111016
  14. 行业内参:2019年支付监管框架将有大调整 线上线下牌照合并重划
  15. 前端sku-spu详解
  16. 经济订货批量(EOQ)模型及有计划的延期交货_库存管理基础
  17. 彩虹六号mute影响服务器笑话,有哪些《彩虹六号》玩家才懂的笑话?
  18. d3.js:取代d3.mouse的d3.pointer
  19. 练习4-6 猜数字游戏 (15分) 代码比较长,新手上路请多关照
  20. AE基础教程第一阶段——01影视后期专业导论

热门文章

  1. 在Makefile中的 .PHONY 是做什么的?
  2. java 计算两个日期之间的天数_Java日期时间API系列22-----Jdk8Month月份和DayOfWeek星期的计算。...
  3. 亿条数据读取工具_仅需1秒!搞定100万行数据:超强Python数据分析利器
  4. Redhat安装gtk2.0和pkg-config
  5. Sublime Text 2
  6. JQuery 匿名函数初识(转载)
  7. linux 下查看log实时输出
  8. OpenCV在图像上画线、矩形、椭圆、多边形、填充的多边形、圆、显示文字
  9. 资源推荐 | TensorFlow电子书《FIRST CONTACT WITH TENSORFLOW》
  10. Qt paintevent事件