首页 > 其他分享 >P3388 【模板】割点(割顶) 题解

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

时间:2023-06-26 18:14:05浏览次数:44  
标签:割顶 int 题解 割点 ++ dfn low ans

一、题目描述:

  给你一个 $n$ 个点,$m$ 条边的无向图。

  求出所有割点,按节点编号升序排序。

  数据范围:$1 \le n \le 2\times 10^4,1 \le m \le 1 \times 10^5$ 。


 二、解题思路:

  板子题,不需要思路。时间复杂度 $O(n+m)$ 。


 三、完整代码:

 1 #include<iostream>
 2 #define N 20010
 3 #define M 100010
 4 using namespace std;
 5 int n,m,rt,cc,tot,num;
 6 int ans[N],dfn[N],low[N];
 7 struct EDGE{
 8     int v,nxt;
 9 }edge[M*2];
10 int head[N],cnt;
11 void add(int u,int v)
12 {
13     edge[++cnt].v=v;
14     edge[cnt].nxt=head[u];
15     head[u]=cnt;
16 }
17 void tarjan(int u)
18 {
19     dfn[u]=low[u]=++tot;int son=0;
20     for(int i=head[u];i!=-1;i=edge[i].nxt)
21     {
22         int to=edge[i].v;
23         if(!dfn[to]){
24             //就是说,这是一颗以u为根的子树了
25             //且它至少与当前访问过的其他子树独立 
26             son++;tarjan(to);
27             low[u]=min(low[u],low[to]); 
28             //反正是我的子树了
29             //low[u]代表这颗子树能到达的最小dfn吧 
30             if(low[to]>=dfn[u]&&u!=rt)
31                 num+=ans[u]==0,ans[u]=1;
32             //如果说当前子树被隔断,自然u就是割点 
33         }else    low[u]=min(low[u],dfn[to]);
34     }
35     if(son>=2&&u==rt) num+=ans[u]==0,ans[u]=1;
36     //特殊判断根节点,很容易理解 
37 }
38 int main()
39 {
40     ios::sync_with_stdio(false);
41     cin.tie(0);cout.tie(0);
42     cin>>n>>m;
43     for(int i=1;i<=n;i++)
44         head[i]=-1;
45     for(int i=1,u,v;i<=m;i++)
46         cin>>u>>v,add(u,v),add(v,u);
47     for(int i=1;i<=n;i++)
48         if(!dfn[i]) rt=i,tarjan(i);
49     //tarjan,一个还不错的算法 
50     cout<<num<<'\n';
51     for(int i=1;i<=n;i++)
52         if(ans[i])    cout<<i<<" ";
53     return 0;
54 }

四、写题心得:

  今天本来学的是圆方树,结果我连点双是什么我都不知道,先来学了割点。收获经验如下:

  $1、割点需要特殊判断根节点=> Exp++$

  $2、根本不用排序,记录答案即可(好吧这好像是桶排)=> Exp++$

标签:割顶,int,题解,割点,++,dfn,low,ans
From: https://www.cnblogs.com/yhy-trh/p/P3388.html

相关文章

  • 【问题解决】echart formatter 模板变量 精度
    遇到这样的精度问题这是之前的配置formatter:`{serie|{a}}\n{data|{c}}`+this.label,这样实现了不同样式,出现了jsnumber类型的精度问题formatter也可以返回模板,返回样式|模板的形式formatter:function(data){return(......
  • 缓存与DB数据一致性问题解决的几个思路
    使用缓存必然会碰到缓存跟真实数据不一致的问题,虽然我们会在数据发生变化时通知缓存,但是这个延迟时间内必然会导致数据不一致,如何解决一般有下面几个思路:首先,当这个延迟如果在业务上时可以接受的,比如文章阅读、评论次数这样的缓存数据,这样的问题这里不考虑。 类似数据库分布式事务......
  • docker 安装 jenkins 以及安装插件出现的问题解决方式
    使用docker-composeversion:"3.9"services:jenkins:image:jenkins/jenkins:lts-jdk11ports:-"8080:8080"-"5000:5000"volumes:-/root/software/jenkins/jenkins-data:/var/jenkins_homeenvir......
  • D Odd Queries 题解
    原题传送门题意简述给定一个数组,再给出m个各自独立(即这个操作不影响后续的询问)的询问,每次给定一个区间,询问将这个区间每个元素都修改为k后,数组总和会是奇数吗?解决思路由于n的范围很大,所以暴力肯定是不可以了,由于每个询问是独立的,我们不需要修改序列,所以不需要使用数据结构。......
  • 01 矩阵题解
    DescirptionSolution若定义\(f(k)\)为一行有\(k\)个\(1\)的方案数,则\(\displaystylef(k)=\binom{m}{k}x^ky^{m-k}\)。则\(\displaystyleE=\sum_{i=0}^{m}i\sum_{j=1}^{n}\binom{n}{j}f(i)^j\left(\sum_{k=i+1}^{m}f(k)\right)^{n-j}\)。不妨设\(\display......
  • CF321C Ciel the Commander 题解 点分治
    题目链接:http://codeforces.com/problemset/problem/321/C解题思路:点分治模板题。每次找到重心给他分配一个字符,分治往下走的时候分配的字符ASCII码\(+1\)即可。示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+5;vector<int>g[maxn];i......
  • 洛谷P4178 Tree 题解 树上点分治
    题目链接:https://www.luogu.com.cn/problem/P4178解题思路:点分治模板题。设当前重心为\(u\),一共有三种不同类型的路径:路径的一个端点恰好是重心\(u\);路径的两个端点在\(u\)的不同子树中;路径的两个端点在\(u\)的同一个子树中。找到重心\(u\)之后,前两类路径分开求......
  • 基于uni-app+vue3渲染markdown格式|uniapp软键盘顶起问题解决方案
    前些时候有给大家分享一篇uni-app+vite4+uview-plus搭建跨端项目。今天主要分享下在uniapp中渲染markdown语法及uniapp中软键盘弹起,页面tabbar或顶部自定义navbar导航栏被撑起挤压的问题。如上图:支持h5+小程序+App端markdown解析渲染。上面则是演示了在App端+小程序端键盘弹......
  • LOJ#6077. 「2017 山东一轮集训 Day7」逆序对题解
    考虑朴素dp,令\(f_{i,j}\)为\(1\simi\)排列有\(j\)个逆序对的排列数。有转移方程:\[f_{i,j}=\sum_{k=0}^{i-1}f_{i-1,j-k}\]特殊地,我们定义\(j<0\)的\(f_{i,j}\)为\(0\)。定义\(\displaystyleF_i(x)=\sum_{j=0}^{\infty}f_{i,j}x^j\),有\(\displaystyleF_{i}(x)=......
  • AGC021E Ball Eat Chameleons 题解
    本文网址:https://www.cnblogs.com/zsc985246/p/17501300.html,转载请注明出处。传送门AGC021EBallEatChameleons题目翻译有\(n\)只变色龙,一开始都是蓝色。你会依次扔出\(k\)个球,每次扔出都要指定一只变色龙吃掉这个球。扔出的球可以是红色或蓝色。变色龙从蓝色变成红......