Online Judge#uoj 67

Label:Tarjan,割点,细节

题目描述

辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树。这个长着毒瘤的树可以用$n$个结点$m$条无向边的无向图表示。这个图中有一些结点被称作是毒瘤结点,即删掉这个结点和与之相邻的边之后,这个图会变为一棵树。树也即无简单环的无向连通图。

现在给你这个无向图,喜羊羊请你帮他求出所有毒瘤结点。

输入

第一行两个正整数$n,m$,表示有$n$个点$m$条边。保证$n≥2$。

接下来$m$行,每行两个整数 \(v,u\),表示$v$和$u$之间有一条无向边。$1≤v,u≤n$。保证没有重边和自环

输出

第一行一个正整数$n_s$,表示这个图中有$n_s$个结点是毒瘤。

接下来一行,共$ns$个整数,每个整数表示一个毒瘤结点的编号。请按编号从小到大的顺序输出。

数据保证图中至少存在一个毒瘤结点

样例

Input#1

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

Output#1

3
4 5 6

Hint

对于40%数据,\(n,m<=1000\);

另存在10%数据,\(m=n-1\);

另存在20%数据,\(m=n\);

对于100%数据,\(n,m<=10^5\)。

题解

删掉毒瘤后,变成一棵树。所以这个毒瘤显然不能是割点,删去一个毒瘤,剩下$n-1$个点,既然是一棵树,也就是说还剩$n-2$条边,那么还需满足一个条件,毒瘤的度为$m-(n-2)=m-n+2$

这道题就变成了裸的Tarjan求割点板子+特判,割点板子在此:)

1.对于根节点,只需满足它的儿子数>=2,它就是割点。

2.对于非根节点x,只需他存在一个儿子y满足$low[y]>=dfn[x]$,x就是割点。

但这题还有几个毒瘤细节。题目说了,数据保证至少存在一个毒瘤,所以大致可以知道数据形成的图是什么样子,显然,存在的联通块数量<=2。而且当联通块数量为2时,有一个联通块只包含一个点,并且此时$m=n-2$,按理说这种情况应该特判一下的(答案就是唯一的那个点),但好像不去判也没关系,就不管它了。剩下的情况都是一个联通块的,所以直接tarjan(1,0)就好了,不用扫一遍for(i=1~n)if(!dfn[i])tarjan(i,0)这样了。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
inline int read(){
int x=0;char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))x=x*10+c-'0',c=getchar();
return x;
}
struct edge{
int to,nxt;
}e[N<<1];
int n,m,ing[N],dfn[N],low[N],ge[N];
int ecnt,head[N];
inline void link(int u,int v){
e[++ecnt].to=v,e[ecnt].nxt=head[u];
head[u]=ecnt;
}
int tot,rootson;
vector<int>ans;
void tarjan(int x,int fa){
dfn[x]=low[x]=++tot;
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].to;
if(!dfn[y]){
if(fa==0)rootson++;
tarjan(y,x);
low[x]=min(low[x],low[y]);
if(fa!=0&&low[y]>=dfn[x])ge[x]=1;
}
else{low[x]=min(low[x],dfn[y]);}
}
if(fa==0&&rootson>=2)ge[x]=1;
}
int main(){
n=read(),m=read();
for(int i=1;i<=m;i++){
int u=read(),v=read();
link(u,v);link(v,u);
ing[u]++,ing[v]++;
}
tarjan(1,0);
for(int i=1;i<=n;i++)if(ing[i]==m-n+2&&!ge[i])ans.push_back(i); printf("%d\n",ans.size());
for(int i=0;i<ans.size();i++)printf("%d ",ans[i]);
}

UOJ67 新年的毒瘤【Tarjan,割点】的更多相关文章

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

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

  2. UOJ67 新年的毒瘤 tarjan

    题目传送门 题意:给出一个$N$个点.$M$条边的无向图,找出其中的点,满足去掉该点与和它相连的边之后,这个图会变成一棵树.$N , M \leq 10^5$ 说是毒瘤,真的不毒瘤 思考一下,我们需要 ...

  3. 【UOJ#67】新年的毒瘤(Tarjan)

    [UOJ#67]新年的毒瘤(Tarjan) 题面 UOJ 题解 一棵\(n\)个节点的树显然有\(n-1\)条边,在本题中意味着删去一个点之后还剩下\(n-2\)条边.那么找到所有度数为\(m-(n- ...

  4. uoj 67 新年的毒瘤 tarjan求割点

    #67. 新年的毒瘤 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/67 Description 辞旧迎新之际 ...

  5. UOJ 67 新年的毒瘤 - Tarjan

    Description 给出一个无向图, 要求找出某个点$u$, 去掉$u$和$u$所连的边, 所剩下的节点构成一棵树. Solution 首先, 割点肯定是不可能满足条件的, 因为去掉割点后会构成若 ...

  6. UOJ67 新年的毒瘤

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  7. uoj 67 新年的毒瘤 割点

    题目链接: 题目 #67. 新年的毒瘤 问题描述 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树. 这个长着毒瘤的树可以用 nn 个结点 mm 条无向边的无向图表示.这个图中有 ...

  8. uoj#67. 新年的毒瘤(割顶)

    #67. 新年的毒瘤 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树. 这个长着毒瘤的树可以用n个结点m 条无向边的无向图表示.这个图中有一些结点被称作是毒瘤结点,即删掉这个结 ...

  9. uoj#67 新年的毒瘤【Tarjan】

    题目:http://uoj.ac/problem/67 题意:n个节点m条边的图,删除某个节点及他相连的所有边之后,剩下的图就成了一棵树.找出所有这样的节点. 思路:上次去清华面试的B题,当时就是在瞎 ...

随机推荐

  1. 解压lzma格式的img文件报“Filename has an unknown suffix, skipping”怎么办

    1 确认img文件是什么压缩格式 file 文件名 2 报标题错误怎么办? mv initrd.img initrd.img.xz xz -d initrd.img.xz cpio -ivd < ...

  2. 【HDUOJ】4280 Island Transport

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意:有n个岛屿,m条无向路,每个路给出最大允许的客流量,求从最西的那个岛屿最多能运用多少乘客到 ...

  3. 框架集 frameset

    框架集和内联框架的作用类似,都用于在一个页面中引入其他的外部的页面 框架集可以同时引入多个页面,而内联框架引入一个, 在h5标准中,推荐使用框架集,而不使用内联框架 使用 frameset 来创建一个 ...

  4. MYSQL查询第二高的薪水

    编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+| Id | Salary |+----+--------+| 1 | 100 || ...

  5. Maven pom配置(Spring+SpringMvc+mybaties)

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...

  6. HIVE的安装步骤及遇到的问题及解决方法

    一.root 用户 解压安装包 二 chown -R hadoop:hadoop apache-hive-1.2.2-bin/          chmod -R 755  apache-hive-1 ...

  7. bzoj1096题解

    [解题思路] 预处理spi=∑pj(j∈[1,i]),si=si-1+(xi-xi-1)*spi-1表示把工厂1~i-1的产品都运到工厂i的花费.于是把工厂j+1~i的产品都运到工厂i的花费为si-s ...

  8. [学习笔记] $FWT$

    \(FWT\)--快速沃尔什变化学习笔记 知识点 \(FWT\)就是求两个多项式的位运算卷积.类比\(FFT\),\(FFT\)大多数求的卷积形式为\(c_n=\sum\limits_{i+j=n}a ...

  9. [JZOJ 5814] 树

    题目:从u到v经过多少条边. 思路: 考虑他是怎么走的?? 从\(u\)到\(v\)一定是\(fa[u]\),\(fa[fa[u]]\),反正就是走\(LCA\),那么如果算出每个点到父亲的期望步数, ...

  10. HDU3605: Escape-二进制优化建图-最大流

    目录 目录 思路: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门  原题目描述在最下面.  \(n(n\leq 100000)\)个人\(m(m\leq 10) ...