码迷,mamicode.com
首页 > 其他好文 > 详细

消防局的设立

时间:2020-02-16 16:18:57      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:深度   void   using   push   距离   back   bit   超过   scanf   

主要思路:贪心,从叶子节点开始(按深度排序即可做到),从它父亲的父亲,把距离不超过 \(2\) 的节点都打上标记,\(ans++\)。这样一定最优,因为必须覆盖那个没被覆盖的节点。注意把根节点的父亲设为根节点,否则从根节点开始跳就RE了

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int n,ans;
bool vis[N];
vector<int>g[N];
int p[N];
struct node2{
    int depth,id;
}d[N];
bool cmp(node2 a,node2 b)
{
    return a.depth>b.depth;
}
void dfs1(int now,int deep,int fa)
{
    d[now].depth=deep;
    p[now]=fa;
    for(int i=0;i<g[now].size();i++)
    {
        if(g[now][i]==fa) continue;
        dfs1(g[now][i],deep+1,now);
    }
}
void era(int now,int dis,int fa)
{
    if(dis>2)return;
    vis[now]=true;
    for(int i=0;i<g[now].size();i++)
    {
        if(g[now][i]!=fa)era(g[now][i],dis+1,now);
    }
}
int main()
{
    scanf("%d",&n);
    p[1]=1;
    d[1].id=1;
    d[1].depth=1;
    for(int i=2;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        d[i].id=i;
        g[x].push_back(i);
        g[i].push_back(x);
    }
    dfs1(1,1,1);
    sort(d+1,d+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        if(vis[d[i].id])continue;
        int grand=p[p[d[i].id]];
        era(grand,0,grand);
        ans++;
    }
    printf("%d\n",ans);
    return 0;
}

消防局的设立

标签:深度   void   using   push   距离   back   bit   超过   scanf   

原文地址:https://www.cnblogs.com/zzctommy/p/12316980.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!