首页 > 编程语言 >gk的树(贪心 dfs) 哈理工程序设计竞赛

gk的树(贪心 dfs) 哈理工程序设计竞赛

时间:2022-09-05 23:33:35浏览次数:105  
标签:ch int void tot dfs define gk 贪心

题目:

​ 给你一棵树,每次操作你可以删去一条边,最少需要多少次操作使每个节点的度数都\(<=k\)

分析:

​ 我们可以想一想如何贪心,对于本题,最优的结果是让任意一个点连的边最多越好(但不能超过K,所以从树的底部到根,能删就删。这样可以保证,删的边数是最少的。

实现:

​ 用dfs跑,注意的是如果没有父节点,tot[u]的初始化为0,其余都是有一个父节点提供一条边。对于一个节点,能删就删。

#include <bits/stdc++.h>

using namespace std;
#define rep(i, a, n) for(int i = a; i < n; i++)
#define all(x) x.begin(), x.end()
#define pb push_back
#define ios ios::sync_with_stdio(false);cin.tie(0);
#define debug(x) cout << x << endl;
#define SZ(x) (int)x.size()
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int inf = 0x3f3f3f3f;
void read(int &x) {int s = 0, f = 1; char ch = getchar(); while(!isdigit(ch)) {f = (ch == '-' ? -1 : f); ch = getchar();} while(isdigit(ch)) {s = s * 10 + ch - '0'; ch = getchar();} x = s * f;}

const int N = 100005;
int n, k;
vector<int> g[N];
int tot[N];
int res;

void init(int len)
{
rep(i, 1, len + 1)
g[i].clear(), tot[i] = 0;
res = 0;
}

void dfs(int u, int fa)
{
tot[u] = fa > 0;
for(int v : g[u])
{
if(v == fa) continue;
dfs(v, u);
tot[u] ++;
}
if(tot[u] > k)
res += tot[u] - k, tot[fa] --;
}

void solve()
{
cin >> n >> k;
init(n);
rep(i, 1, n)
{
int u, v; cin >> u >> v;
g[u].pb(v); g[v].pb(u);
}

dfs(1, -1);
cout << res << '\n';
}

signed main()
{
int _ = 1;
cin >> _;
while(_--)
solve();
}

标签:ch,int,void,tot,dfs,define,gk,贪心
From: https://www.cnblogs.com/DM11/p/16660072.html

相关文章

  • HDFS 伪分布式环境搭建
    HDFS伪分布式环境搭建作者:Grey原文地址:博客园:HDFS伪分布式环境搭建CSDN:HDFS伪分布式环境搭建相关软件版本Hadoop2.6.5CentOS7OracleJDK1.8安装步......
  • 洛谷 P1036 [NOIP2002 普及组] 选数(dfs)
    https://www.luogu.com.cn/problem/P1036题目大意:从给定的n个数中选出m个求和,结果是一个素数的情况有多少种?输入43371219输出1这个题目的代码是根据Acwing中......
  • docker 搭建 fastdfs
    1.先通过dockerpulldelron/fastdfs拉取最新的镜像。dockerpulldelron/fastdfs2.分别启动tracker容器和storage容器。dockerrun-d--nametracker-p22122:2......
  • D - path || 2019CCPC网络赛 || 贪心,优先队列,vector
    题意:求无起止点的k短路多组数据,效率约为nlogn解法:由于无起止点,就可以用类似kruskal的贪心思路,优先考虑最短的道路并计数。每使用一个当前最短道路,就入队一个次短道路......
  • AGC001 C Shorten Diameter(dfs)
    AGC001CShortenDiameter本题不难,不至于紫(解题思路看到\(n\leq2000\)就知道是\(O(n^2)\)没得跑了。关键如何\(O(n^2)\)。我们可以对\(k\)进行分类。如果\(......
  • 牛客dfs专题 NC13594 选择困难症(dfs+剪枝)
    链接:https://ac.nowcoder.com/acm/problem/13594来源:牛客网题目描述有k类物品,每类物品的个数为Ai,每个物品有一个喜欢值Vj,代表小L对这件物品的喜欢程度。小L想知道,有多......
  • 牛客dfs专题:轰炸区最优选取(二维前缀和)
    链接:https://ac.nowcoder.com/acm/problem/14505来源:牛客网题目描述现在给出一个正方形地图,其边长为n,地图上有的地方是空的,有的地方会有敌人。我们现在有一次轰炸敌人......
  • 放弃FastDFS!SpringBoot整合MinIO实现分布式文件服务,真香!
    今天分享一个非常不错且开源的分布式存储组件MinIO,有很多朋友在用。什么是MinIO?Minio是个基于Golang编写的开源对象存储套件,基于ApacheLicensev2.0开源协议,虽然轻量......
  • AcWing算法基础课---第三讲基础算法---01DFS和BFS
    DFSAcWing842.排列数字#include<iostream>usingnamespacestd;constintN=10;intn;intpath[N],st[N];voiddfs(intu){if(u==n){......
  • 红与黑(用dfs求洪水灌溉)
    https://www.acwing.com/problem/content/1115/#include<bits/stdc++.h>usingnamespacestd;constintN=25;charg[N][N];boolst[N][N];intn,m;intsx,sy;......