Tree with Small Distances

Tree with Small Distances

https://ac.nowcoder.com/acm/problem/113026

题意:

个点条边的无向连通图,问最少加多少条边才能使顶点到任意一个点不超过两条边。

思路:
一种贪心的策略是如果某个点到根结点的边数超过二就把该节点的父结点和根结点连条边

图片说明

检验刚开始的策略:

图片说明

连了这条边后,的边数都变成了
因为没有考虑到结点和根结点连边对父结点的影响,导致多连了一条边

正确的方案应该是下面这幅图:

图片说明

所以正确的策略不仅要考虑连接某个结点后对孩子结点的影响,还要考虑对父结点的影响。
统计每个点到根的距离,从叶子结点开始判断,如果某个结点到根结点距离大于,该节点的父结点就和根结点连边,同时更改父结点以及父结点的父结点到根结点的距离。

Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+7,maxm=4e5+7;
inline ll read() {
    ll s = 0, w = 1;
    char ch = getchar();
    while (ch < 48 || ch > 57) {
        if (ch == '-') w = -1;
        ch = getchar();
    }
    while (ch >= 48 && ch <= 57)
        s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
    return s * w;
}
int head[maxn],Next[maxm],to[maxm],tot;
void add(int x,int y) {
    to[++tot]=y;
    Next[tot]=head[x];
    head[x]=tot;
}
int ans,hi[maxn];
void dfs(int x,int f,int dep) {
    bool flag=true;
    hi[x]=dep;
    for(int i=head[x],v;i;i=Next[i]) {
        v=to[i];
        if(v==f) continue;
        dfs(v,x,dep+1);
        if(flag&&hi[v]>2) {
            hi[v]=2;
            hi[x]=1;
            hi[f]=2;
            flag=false;
            ans+=1;
        }
    }
}
int main() {
    int n=read();
    for(int i=2,u,v;i<=n;++i) {
        u=read(),v=read();
        add(u,v),add(v,u);
    }
    dfs(1,0,0);
    printf("%d\n",ans);
    return 0;
}
每日一题 文章被收录于专栏

牛客每日一题

全部评论

相关推荐

04-15 13:42
四川大学 Java
蹲蹲offerrr:快投吧,有点晚现在
点赞 评论 收藏
分享
04-08 23:14
已编辑
南阳理工学院 算法工程师
本人情况:26届双非本科,两段实习经历,目前拿到的都是实习的offer,一个校招的都没有,他们都说先实习,然后等拿到毕业证了直接转正,我又害怕干三个月给我叉出去面试题也发一下吧###&nbsp;杭州问尔信息技术后端登录你是怎么做的?JWT令牌你了解过吗?他虽然是一段字符串,他表达了什么东西?怎么解析出来信息和过期时间?JWT令牌怎么续期?如果我拉黑一个账号,要怎么做?两种方案(有无redis)mongodb和mysql的区别?mongodb和mysql分别实用于什么项目?选型你会怎么选?数据库的事务,那些地方需要使用,那些地方不需要使用?他会影响什么性能?mysql和pgsql有什么差异你知道吗?消息队列&nbsp;redis也有,为什么要用mq?前后端会部署吗?docker会用吗?内部通信前端&nbsp;async和&nbsp;await你知道吗?异步编程的原理是什么?vue3&nbsp;为什么你改变一个字符串&nbsp;前端会跟着改动AI工具会用什么?你会怎么用?###&nbsp;仲财通常用的锁有哪些synchronize和ReentrantLock的区别分布式锁了解吗?分布式事务mysql表字段sql优化什么时候用索引索引什么时候会失效mysql事务ioc一些项目应用问题###&nbsp;观妙科技项目问题...zset的架构是什么样子的线程池突然队列被打满了怎么办?如果上游和下游都无法控制,该怎么维护select&nbsp;*&nbsp;from&nbsp;user&nbsp;where&nbsp;age&gt;20&nbsp;order&nbsp;by&nbsp;update_time&nbsp;索引设计检索过程是什么样的冒泡排序和快排,有什么区别怎么判断链表有没有环###&nbsp;观妙科技-二面项目部分...线程池的核心参数有哪些你是怎么用线程池的JMMG1模型跳表介绍一下平衡二叉树TCP为什么要三次握手?说一下hashmap红黑树的特征你有什么学习的方法
牛马人的牛马人生:对学院本而言很强了
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务