CF1029E Tree with Small Distances 题解

题意简述

给定一颗有根树(根节点为 1 1 1)。要求往树中加入一些边使得从根节点到其他节点的距离至多是 2 2 2。求加入边的最小数量。(边全部都是无向的)

解题思路

还是采用贪心的思路。

对于一个到根节点的距离大于 2 2 2 的叶子节点,我们只有两种方法使它到根节点的距离小于等于 2 2 2,要么直接连它和根节点,要么连接它的父亲和根节点。比较显然的是,如果连接它的父亲和根节点,一定不劣于连接它和根节点。

然后接下来这一步和其他题解说的都不太一样。大部分题解在得出贪心的策略后是把所有点按深度排序,然后开始贪心。但是根据我们上面推出的东西,我们只需要保证每次处理的是叶子节点就可以,这启示我们使用拓扑排序。

具体地,先 dfs 一遍求出每个点的父亲,然后进行拓扑排序,将拓扑排序的结果记录下来,进行贪心即可。

由于不需要排序,所以时间复杂度其实是优于其他题解所述的贪心。

代码示例

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,vis[200010],ans=0,du[200010],fa[200010],num[200010],cnt=0;
vector<int> G[200010];
void dfs(int u,int Fa){
   
	fa[u]=Fa;
	for(int v:G[u]) if(v!=Fa) dfs(v,u);
}
signed main(){
   
	cin>>n;
	for(int i=1;i<=n-1;i++){
   
		int u,v;
		cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
		du[u]++,du[v]++;
	}
	dfs(1,0);//找父亲
	vis[1]=1;
	for(int u:G[1]){
   
		vis[u]=1;
		for(int v:G[u]) vis[v]=1;
	}
    //把根节点周围先标记了
	queue<int> q;
	for(int i=1;i<=n;i++) if(!vis[i]&&du[i]==1) q.push(i);
	while(!q.empty()){
   
		int u=q.front();q.pop();
		num[++cnt]=u;
		for(int v:G[u]){
   
			du[v]--;
			if(du[v]==1) q.push(v);
		}
	}
    //拓扑
	for(int i=1;i<=cnt;i++){
   
		int u=num[i];
		if(vis[u]) continue;
		vis[fa[u]]=1;
		ans++;
		for(int v:G[fa[u]]) vis[v]=1;
	}
    //贪心
	cout<<ans<<endl;
	return 0;
}

相关推荐

  1. CF1029E Tree with Small Distances 题解

    2024-01-27 11:08:06       38 阅读
  2. CF988D题解

    2024-01-27 11:08:06       10 阅读
  3. 题解CF1923D(Slimes)

    2024-01-27 11:08:06       22 阅读
  4. CF1902 B Getting Points 题解

    2024-01-27 11:08:06       47 阅读
  5. CF1893C Freedom of Choice 题解

    2024-01-27 11:08:06       29 阅读
  6. 题解CF1922C(Closest Cities)

    2024-01-27 11:08:06       35 阅读
  7. CF97B Superset 题解 分治

    2024-01-27 11:08:06       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-27 11:08:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-27 11:08:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-27 11:08:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-27 11:08:06       18 阅读

热门阅读

  1. TiDB中Table映射到KV

    2024-01-27 11:08:06       30 阅读
  2. nginx做盗链与防盗链配置

    2024-01-27 11:08:06       26 阅读
  3. 常用的gpt-4 prompt words收集8

    2024-01-27 11:08:06       25 阅读
  4. php 源码加密保护 bease方案

    2024-01-27 11:08:06       26 阅读
  5. android studio开发的一些问题

    2024-01-27 11:08:06       35 阅读
  6. CentOS 7.9 OS Kernel Update 3.10 to 4.19

    2024-01-27 11:08:06       29 阅读
  7. 出现次数超过一半的数(c++题解)

    2024-01-27 11:08:06       31 阅读