Tree with Small Distances 1029E(贪心)

题目传送门

题意: 给你一棵树,你可以从1出发向各个点加一条边,问你最少连多少条边,使得从1出发到任何一个点的距离都小于等于2。(每条边的边权为1)。

思路: 我们假设有一个点与1的距离大于2,然后他有很多个子节点,子节点的距离肯定也大于2,如果我们连一个子节点,那么这个父节点也合法了,但是其他子节点并不合法,但是如果我们直接连父节点,那么父节点和所有子节点都会变合法。
那么处理父节点永远比处理子节点好。那是不是先处理深度小的?答案并不是。因为如果我们先处理深度小的,有三个点,距离为 3 4 5。如果我们先处理最浅的,并且连父亲,要3条边,而优先处理深的,只需要1条边就行。

#include<bits/stdc++.h>
#define endl '\n'
#define null NULL
#define ls p<<1
#define rs p<<1|1
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define ll long long
#define int long long
#define vi vector<int>
#define mii map<int,int>
#define pii pair<int,int>
#define ull unsigned long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
char *fs,*ft,buf[1<<20];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read(){
int x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
return x*f;}
using namespace std;
const int N=2e5+5;
const int inf=0x7fffffff;
const int mod=1e9+7;
const double eps=1e-6;
vi e[N];
int deep[N],fa[N],vis[N];
priority_queue<pii>q;
void dfs(int x,int y)
{
    deep[x]=deep[y]+1;
    fa[x]=y;
    if(deep[x]>3)
    {
        q.push(mp(deep[x],x));
    }
    for(auto i:e[x])
    {
        if(i!=y)
        {
            dfs(i,x);
        }
    }
}
signed main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n-1;i++)
    {
        int u,v;
        cin>>u>>v;
        e[v].pb(u);e[u].pb(v);
    }
    dfs(1,0);
    for(int i=1;i<=n;i++)
        if(deep[i]<=3)
            vis[i]=1;
        else
            vis[i]=0;
    int cnt=0;
    while(!q.empty())
    {
        pii p=q.top();q.pop();
        if(vis[p.second])
            continue;
        int f=fa[p.second];
        cnt++;
        vis[f]=1;
        for(auto i:e[f])
        {
            vis[i]=1;
        }
    }
    cout<<cnt<<endl;
}
原创文章 144 获赞 13 访问量 8687

猜你喜欢

转载自blog.csdn.net/Joker_He/article/details/105798277