uvaoj 1267 - Network

题解:
1.贪心,把树的任意一点作为树根,这棵有根树的‘最深叶子节点’的最优服务安装位置是确定的!
总结:
1.这道题没有自己想出来,憋了好久好久啊!总结一下,现在总是习惯性的躺在床上才想题,丢掉了在纸上随意画一画的习惯了,导致总是在一个地方纠结而没有看到那里没有想到!(画在纸上可能更能帮助完善思维)
2.这道题目的一个关键是把无根树想成有根树!无形中加强了条件,以后再去从极端的地方入手,也许就能思考出问题了
3.下次如果再想不出来问题,早点看答案,先就看一句解释,然后再继续思考

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
#define MAXN 1005
vector<int>vec[MAXN],deep[MAXN];
int _,n,k,s,ans,father[MAXN];
bool covered[MAXN];
void dfs(int u,int fa,int d)
{
    if(vec[u].size() == 1)
    {
        covered[u] = true;
        return;
    }
    if(d == 0)return;
    for(int i = 0;i < vec[u].size();i++)if(vec[u][i] != fa)
        dfs(vec[u][i],u,d - 1);
}
void pre_dfs(int u,int fa,int d)
{
    if(vec[u].size() == 1 && u != s)
    {
        deep[d].push_back(u);
        return;
    }
    for(int i = 0;i < vec[u].size();i++)
    {
        int v = vec[u][i];
        if(v == fa)continue;
        father[v] = u;
        pre_dfs(v,u,d + 1);
    }
}
void solve()
{
    pre_dfs(s,-1,1);
    dfs(s,-1,k);
    for(int d = n;d >= 1;d--)
        for(int i = 0;i < deep[d].size();i++)
        {
            int u = deep[d][i];
            if(covered[u])continue;
            int fa = u;
            for(int i = 0;i < k;i++)
                fa = father[fa];
            dfs(fa,-1,k);
            ans++;
        }
}
int main()
{
    cin >> _;
    while(_--)
    {
        cin >> n >> s >> k;
        for(int i = 1;i <= n;i++)
            vec[i].clear(),deep[i].clear();
        memset(covered,0,sizeof(covered));
        ans = 0;
        for(int i = 1;i < n;i++)
        {
            int u,v;
            cin >> u >> v;
            vec[u].push_back(v);
            vec[v].push_back(u);
        }
        solve();
        cout << ans << endl;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值