分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

UVALive - 3902 Network

发布时间:2023-09-06 02:20责任编辑:胡小海关键词:暂无标签

上一篇博客题目的普遍情况

这里跟前面那道题有点不同的地方是它的半径变得任意可变,并且给了一个初始的节点已经覆盖,并且最终的目的是让所有的叶子都覆盖。

做法跟上道题是类似的。

无根树还是变成有根树好,既然直接给了我们一个特殊点,那就直接拿它做根。

首先先dfs一下,判断哪些点是叶子,顺便统计出dep数组。

既然根已经添加,直接先半径为\(k\)地覆盖一下。把一些初始化就覆盖好的叶子忽略掉。

然后就是一样的弄一个堆,按照深度大小来排序,深度大的叶子先出队。

这个叶子直接取它的\(k\)级父亲,然后就拿它来覆盖就可以了。直到所有叶子都覆盖完。

代码:

#include<cstdio>#include<cstring>#include<queue>const int maxn = 1005;struct Edges{ ???int next, to;} e[maxn << 1];int head[maxn], tot;int dep[maxn], fa[maxn];bool vis[maxn];bool leaf[maxn];int n, s, k;struct cmp{ ???bool operator () (const int &a, const int &b) const ???{ ???????return dep[a] < dep[b]; ???}};void link(int u, int v){ ???e[++tot] = (Edges){head[u], v}; ???head[u] = tot;}void dfs(int u, int f){ ???dep[u] = dep[f] + 1; fa[u] = f; ???int cnt = 0; ???for(int i = head[u]; i; i = e[i].next) ???{ ???????cnt++; ???????int v = e[i].to; ???????if(v == f) continue; ???????dfs(v, u); ???} ???if(cnt == 1) leaf[u] = true;}void dfs2(int u, int f, int d){ ???vis[u] = true; ???if(d == k) return; ???for(int i = head[u]; i; i = e[i].next) ???{ ???????int v = e[i].to; ???????if(v == f) continue; ???????dfs2(v, u, d + 1); ???}}int main(){ ???int T; scanf("%d", &T); ???while(T--) ???{ ???????memset(head, 0, sizeof head); tot = 0; ???????scanf("%d%d%d", &n, &s, &k); ???????for(int i = 1; i < n; i++) ???????{ ???????????int u, v; scanf("%d%d", &u, &v); ???????????link(u, v); link(v, u); ???????} ???????memset(dep, 0, sizeof dep); ???????memset(fa, 0, sizeof fa); ???????dfs(s, 0); ???????memset(vis, false, sizeof vis); ???????dfs2(s, 0, 0); ???????std::priority_queue<int, std::vector<int>, cmp> heap; ???????for(int i = 1; i <= n; i++) ???????{ ???????????if(leaf[i] && !vis[i]) heap.push(i); ???????} ???????int ans = 0; ???????while(!heap.empty()) ???????{ ???????????int x; ???????????while(!heap.empty() && vis[x = heap.top()]) heap.pop(); ???????????if(heap.empty()) break; ???????????int v = x; ???????????for(int i = 1; i <= k; i++) v = fa[v]; ???????????dfs2(v, 0, 0); ???????????ans++; ???????} ???????printf("%d\n", ans); ???} ???return 0;}

UVALive - 3902 Network

原文地址:https://www.cnblogs.com/Garen-Wang/p/9882816.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved