UOJ67 新年的毒瘤

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000 
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

题目链接:http://uoj.ac/problem/67

正解:tarjan+树的相关性质

解题报告:

  考虑能变成一棵树,肯定说明至少选择的点不是割点,其次题解里面说了这个点的度数有特定的要求...

  那么就变成简单题了...

  只需找出不是割点且度数=m-(n-2)的点即可。

  注意有一些奇怪的边界条件...

  (不要想当然的以为m=n-1答案是0...)

//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <complex>
using namespace std;
typedef long long LL;
const int MAXN = 100011;
const int MAXM = 200011;
int n,m,d[MAXN],ecnt,first[MAXN],next[MAXM],to[MAXM],dfn[MAXN],low[MAXN];
int ans,dui[MAXN];
bool iscut[MAXN];
//需要考虑单独一个点在一个连通块,而其余的点构成一棵树的情况...
inline int getint(){
    int w=0,q=0; char c=getchar(); while((c<‘0‘||c>‘9‘) && c!=‘-‘) c=getchar();
    if(c==‘-‘) q=1,c=getchar(); while (c>=‘0‘&&c<=‘9‘) w=w*10+c-‘0‘,c=getchar(); return q?-w:w;
}

inline void tarjan(int x,int fa,int rt){
	int size=0; dfn[x]=++ecnt; low[x]=dfn[x];
	for(int i=first[x];i;i=next[i]) {
		int v=to[i]; if(v==fa) continue;
		if(!dfn[v]) {
			size++;/*!!!*/
			tarjan(v,x,rt);
			if(low[v]>=dfn[x] && x!=rt) iscut[x]=true;
			low[x]=min(low[x],low[v]);
		}
		else low[x]=min(low[x],dfn[v]);
	}
	if(size>1 && x==rt) iscut[x]=1;
}

inline void work(){
	n=getint(); m=getint(); int x,y;
	for(int i=1;i<=m;i++) {
		x=getint(); y=getint(); d[x]++; d[y]++;
		next[++ecnt]=first[x]; first[x]=ecnt; to[ecnt]=y;
		next[++ecnt]=first[y]; first[y]=ecnt; to[ecnt]=x;
	}
	ecnt=0; int LIM=m-(n-2);
	for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,-1,i);
	for(int i=1;i<=n;i++) if(d[i]==LIM && (!iscut[i])) dui[++ans]=i;
	printf("%d\n",ans);
	for(int i=1;i<=ans;i++) printf("%d ",dui[i]);
}

int main()
{
    work();
    return 0;
}

  

时间: 2025-01-04 09:12:35

UOJ67 新年的毒瘤的相关文章

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】新年的毒瘤(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

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 inl

UOJ #67 新年的毒瘤

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

【UOJ Goodbye Jiawu】

A.新年的巧克力棒 这道题我的做法是:如果有2^k个巧克力那么很好算,所以把给定的数字二进制拆分: 2得到1,4得到3,8得到7...每一个都是前一位的2倍+1 #include <iostream> #include <cstdio> #include <cmath> #include <cstdlib> #include <cstring> using namespace std; int main() { int T; scanf(&quo

怎样设定目标(七)号召:使我的新年目标成功!

是时候开始规划我的新年目标了吗? 我想,每当大家走到旧一年快要结束时,你脑海中又重现了这个问题--是时候开始规划我的新年目标了吗?说句实话,我们承受了太多的失败,以往这个时候你也计划了新一年的目标,可结果总是不了了之.或许你已经认为新年目标不过是个愿望而已,它根本就不管用!年复一年,不出几个月不是忘得干干净净,就是一甩便放弃了. 为什么新年目标看起来不成功? 想像一下:在年终庆祝会上,一位好友蹭了过来跟你聊天:"你明年有什么打算?"你根本就还没有认真地考虑过,所以只好含糊地回答:&qu

分享:我用一天时间开发的 新年送祝福 微信手机网站(可在线体验附图)(要代码的留下邮箱)

分享:我用一天时间开发的 新年送祝福 微信手机网站(要代码的留下邮箱) (可在线体验附图)(要代码的留下邮箱) 大家有好的建议或想法欢迎随时与我联络,并将附赠全部代码一份. 微信或手机浏览器中的运行效果如下: 首页 摇一摇之后 编辑祝福语 祝福送给朋友 祝福送给微信朋友后的效果: 手机或微信体验地址: http://fenxiang.yunxunmi.com/ 微信二维码:  大家有好的建议或想法欢迎随时与我联络,并将附赠全部代码一份.

新年计划随笔

新年终于颤颤巍巍的走了,元宵节也随之而过了,工作第二年的自己也需要有进一步的进步了,新的一年里希望自己能有更多的收获学习. 近期的小目标: 1.每天早上起床,温习线性代数,理解学校时期没有理解的东西,为后期的拔高做好基础. 2.学习更好的时间规划,可以更充分的利用时间学习.工作.尽量减少无意识的消耗的时间. 3.学习一些爬虫或者经济相关的知识. 4.可以保持一些做总结的好习惯. 对自己暂时就这么多要求了,so,前进路上,且行且努力.加油!!