UOJ #67. 新年的毒瘤

Description

给你一个无向图,求删掉一个点及其连的边后,剩下的图是树结构,求这些点.

Sol

Tarjan求割点.

只需要求出割点,因为删掉的点只需要满足:不是割点(保证连通),边数位m-(n-2),即可.

PS:Tarjan求割点的时候对于根要计算是他子树的点,而不是他的度数.

Code

#include<cstdio>
#include<vector>
#include<iostream>
using namespace std;

const int N = 100005;
#define debug(a) cout<<#a<<"="<<a<<" "

int n,m,cnt,ans;
vector<int> g[N];
int b[N],out[N],du[N];
int dfsn[N],low[N];

inline int in(int x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
void Tarjan(int u,int fa){
	dfsn[u]=low[u]=++cnt;int c=0;
	for(int i=0,v;i<du[u];i++) if((v=g[u][i])!=fa){
		if(!dfsn[v]){
			Tarjan(v,u),low[u]=min(low[u],low[v]),c++;
			if(fa>0&&dfsn[u]<=low[v]) b[u]=1;
		}else low[u]=min(low[u],dfsn[v]);
	}if(fa==0&&c>1) b[u]=1;
}
int main(){
//	freopen("in.in","r",stdin);
	n=in(),m=in();
	for(int i=1,u,v;i<=m;i++) u=in(),v=in(),du[u]++,du[v]++,g[u].push_back(v),g[v].push_back(u);
	for(int i=1;i<=n;i++) if(!dfsn[i]) Tarjan(i,0);
	
//	for(int i=1;i<=n;i++) debug(g[i].size()),debug(low[i]),debug(dfsn[i])<<endl;
	
	for(int i=1;i<=n;i++) if(du[i]==m-n+2&&!b[i]) out[++ans]=i;
	printf("%d\n",ans);
	for(int i=1;i<=ans;i++) printf("%d ",out[i]);putchar('\n');
	return 0;
}

  

转载于:https://www.cnblogs.com/beiyuoi/p/5925407.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值