UOJ#67 新年的毒瘤 tarjan

题目传送门

题意:给出一个$N$个点、$M$条边的无向图,找出其中的点,满足去掉该点与和它相连的边之后,这个图会变成一棵树。$N , M \leq 10^5$



说是毒瘤,真的不毒瘤

思考一下,我们需要找的就是度为$M - (N - 1 - 1)$且不是割点的点,直接tarjan即可

想起来在某luogu题解里把tarjan写成targan

 1 #include<bits/stdc++.h>
 2 #define MAXN 100001
 3 using namespace std;
 4
 5 inline int read(){
 6     int a = 0;
 7     char c = getchar();
 8     while(!isdigit(c))
 9         c = getchar();
10     while(isdigit(c)){
11         a = (a << 3) + (a << 1) + (c ^ ‘0‘);
12         c = getchar();
13     }
14     return a;
15 }
16
17 struct Edge{
18     int end , upEd;
19 }Ed[MAXN << 1];
20
21 int head[MAXN] , dfn[MAXN] , low[MAXN] , in[MAXN] , ts , cntEd , N , M;
22 bool vis[MAXN];
23
24 inline void addEd(int a , int b){
25     Ed[++cntEd].end = b;
26     Ed[cntEd].upEd = head[a];
27     head[a] = cntEd;
28     in[a]++;
29 }
30
31 void tarjan(int a , int fa){
32     dfn[a] = low[a] = ++ts;
33     int ch = 0;
34     for(int i = head[a] ; i ; i = Ed[i].upEd)
35         if(Ed[i].end != fa)
36             if(!dfn[Ed[i].end]){
37                 tarjan(Ed[i].end , a);
38                 low[a] = min(low[Ed[i].end] , low[a]);
39                 ch++;
40                 if(low[Ed[i].end] >= dfn[a] && a != 1)
41                     vis[a] = 1;
42             }
43             else
44                 low[a] = min(low[a] , dfn[Ed[i].end]);
45     if(a == 1 && ch >= 2)
46         vis[a] = 1;
47 }
48
49 int main(){
50     N = read();
51     M = read();
52     for(int i = 1 ; i <= M ; i++){
53         int a = read() , b = read();
54         addEd(a , b);
55         addEd(b , a);
56     }
57     tarjan(1 , 0);
58     int ans = 0;
59     for(int i = 1 ; i <= N ; i++)
60         if(in[i] == M - N + 2 && !vis[i])
61             ans++;
62     cout << ans << endl;
63     for(int i = 1 ; i <= N ; i++)
64         if(in[i] == M - N + 2 && !vis[i])
65             cout << i << ‘ ‘;
66     return 0;
67 }

原文地址:https://www.cnblogs.com/Itst/p/9783948.html

时间: 2024-08-29 09:16:22

UOJ#67 新年的毒瘤 tarjan的相关文章

uoj 67 新年的毒瘤 tarjan求割点

#67. 新年的毒瘤 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/67 Description 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树. 这个长着毒瘤的树可以用 n 个结点 m 条无向边的无向图表示.这个图中有一些结点被称作是毒瘤结点,即删掉这个结点和与之相邻的边之后,这个图会变为一棵树.树也即无简单环的无向连通图. 现在给你这个无向图,喜羊羊请你帮他求出所有毒瘤结点. I

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

#67. 新年的毒瘤 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树. 这个长着毒瘤的树可以用n个结点m 条无向边的无向图表示.这个图中有一些结点被称作是毒瘤结点,即删掉这个结点和与之相邻的边之后,这个图会变为一棵树.树也即无简单环的无向连通图. 现在给你这个无向图,喜羊羊请你帮他求出所有毒瘤结点. 样例一 input 6 6 1 2 1 3 2 4 2 5 4 6 5 6 output 3 4 5 6 256MB 来源 UOJ Goodbye Jiawu [思路] 无向

UOJ #67 新年的毒瘤

题目描述: 有一幅 n 个点 m 条边的图,问单独删掉哪些点,可以使原图变成一棵树.(保证至少有一个解) 解题思路: 注意到树的性质是有 n 个点,n - 1 条边的联通图.而删掉一个点后新图有n-1个点,所以需要选择的点的度数是 m - ( n - 2 ).而要保证新图联通,所以要先Tarjan找割点,不要删割点就可以了. 代码: #include <cstdio> #include <cstring> #include <algorithm> using names

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

[UOJ#67]新年的毒瘤(Tarjan) 题面 UOJ 题解 一棵\(n\)个节点的树显然有\(n-1\)条边,在本题中意味着删去一个点之后还剩下\(n-2\)条边.那么找到所有度数为\(m-(n-2)\)的点就好了.但是因为是一棵树,所以联通,所以割点不是答案. #include<iostream> #include<cstdio> using namespace std; #define ll long long #define MAX 100100 inline int r

UOJ67 新年的毒瘤

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目链接:http://uoj.ac/problem/67 正解:tarjan+树的相关性质 解题报告: 考虑能变成一棵树,肯定说明至少选择的点不是割点,其次题解里面说了这个点的度数有特定的要求... 那么就变成简单题了... 只需找出不是割点且度数=m-

uoj 66 新年的巧克力棒 数学

#66. 新年的巧克力棒 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/66 Description 马上就要到羊年了,羊村一片欢腾,懒羊羊则懒洋洋地躺在草坪上吃新年的巧克力棒. 他手上的巧克力棒是个由 n 个巧克力单元格组成的长度为 n 的长条,现在懒羊羊想把巧克力棒掰开成一个个小单元格. 初始时懒羊羊会把这根巧克力棒丢在草坪上,然后每次懒羊羊会从草坪上拿起一根长度大于 1 的巧克力棒,然后从某两个相邻的

uoj 176 新年的繁荣 - 贪心 - 并查集

题目传送门 传送门 题目大意 每个点有一个点权$a_i$,连接点$u$和点$v$的边的边权是$a_u\ and\ a_v$,问最大生成树. 我们从大到小考虑每一种边权,如果两个未连通的点的点权同时包含这个边权作为子集,显然用这样的边连接这些点最优. 因此每一种已经考虑过的边权,我们用并查集取一个代表元. 每枚举到一个新的边权就尝试合并一些已有的连通块. Code 1 /** 2 * uoj 3 * Problem#176 4 * Accepted 5 * Time: 1128ms 6 * Mem

UOJ#351. 新年的叶子 概率期望

原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ351.html 题目传送门 - UOJ351 题意 有一个 n 个节点的树,每次涂黑一个叶子节点(度为 1 的节点),可以重复涂黑. 问使得白色部分的直径发生变化的期望涂黑次数. $n\leq 5\times 10^5$ 题解 首先考虑什么情况下直径长度会发生改变. 考虑找到直径的中点,可能在边上. 对于这个直径相连的每一个子树,分别算出在这个子树中的距离直径中点距离为直径长度的一半的节点个数. 于是我

UOJ#460. 新年的拯救计划 构造

原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ460.html 题解 本题的构造方法很多.这里只介绍一种. 首先,总边数为 $\frac{n(n-1)}2$,每一棵树需要 $2(n-1)$ 条边,所以答案最多是 $\lfloor \frac n 2 \rfloor$ . 然后我们来找到构造出 $\lfloor \frac n 2 \rfloor$ . 这里我们只考虑 n 为偶数,因为如果 n 为奇数的话就只要在 n-1 的基础上随便连就好了. 考虑增