(AtCoder Beginner Contest 333)

比赛链接:

Tasks - Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)

D - Erase Leaves

题目大概意思:

给你一个树, 问你把结点1给删除掉,最少需要删除几个点 

分析: 

假设有m个结点和结点1相连,那么要想把1给删除掉,那么就要先删除掉m-1个与1相连的节点,这样就剩1个结点和结点1相连,这样结点1就变成了叶子结点,这样就可以直接把结点1给删去了,题目让求的是最小的删除,那么把与1相连的m个节点排个序,但是我们怎么去求节点数呢?这里有一个很典型dfs的算法就是求以i为根节点 的树的节点个数 dfs(int u, int fa) 要去记录这个fa,也就是这个节点的父节点,要是不记录的话会发生死循环,父节点枚举儿子节点,儿子结点又枚举父节点,这就是死循环了,因此我们要加一个if(son == fa)continue;要注意刚开始时,1就是叶子结点这个特殊情况,那直接把1这个节点给删除就行了

代码:

#include<bits/stdc++.h>
#define y1 Y1
#define fi first
#define endl "\n"
#define se second
#define PI acos(-1)
#define int long long
#define pb(x) push_back(x)
#define PII pair<int, int>
#define Yes cout << "Yes\n";
#define No cout << "No\n";
#define YES cout << "YES\n";
#define NO cout << "NO\n";
#define _for(i, a, b) for(int i = a; i <= b; ++i)
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;

const int N = 3e5 + 10;
int n, m, ret;
string s;
vector<int>h[N];
vector<int>t;
int cnt[N];//以 i为根节点 的树的节点个数

void dfs(int u, int fa) {
	cnt[u] = 1;
	for(auto son : h[u]) {
		if(son == fa)continue;
		dfs(son, u);//回来的时候 cnt[son]已经算出来了 
		cnt[u] += cnt[son];
	}
}


signed main() {
	IOS;
	cin >> n;
	_for(i, 1, n - 1) {
		int x, y;
		cin >> x >> y;
		h[x].push_back(y);
		h[y].push_back(x);
	}
	if(h[1].size() == 1) {
		cout << 1 << endl;
		return 0;
	}
	dfs(1, 0);
	
	for(auto son : h[1]) {
		t.push_back(cnt[son]);
	}
	sort(t.begin(), t.end());
	m = h[1].size();
	
	_for(i, 0, t.size() - 2) {
		ret += t[i];
	}
	
	cout << ret + 1 << endl;//还要把1这个节点给删除 因此要+1 
	return 0;
}
/*
6
1 2
2 3
2 4
3 5
3 6
*/
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FindYou.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值