zoukankan      html  css  js  c++  java
  • AT3912 Antennas on Tree

    AT3912 Antennas on Tree 

    %%zzt

    只能考虑性质了。

    把最后选择的k个点的连通块求出来,连通块内部的点表示都是互异的

    连通块外部的点只能形成若干条链,并且这k个点的每一个最多与一个外部点相连。

    直接从每个叶子往上跳,当fa[x]度数>2的时停下

    如果fa[x]之前没有链,那么可以先省下一次,否则就要把x变成k个点之一

    #include<bits/stdc++.h>
    #define reg register int
    #define il inline
    #define fi first
    #define se second
    #define mk(a,b) make_pair(a,b)
    #define numb (ch^'0')
    #define pb push_back
    #define solid const auto &
    #define enter cout<<endl
    #define pii pair<int,int>
    using namespace std;
    typedef long long ll;
    template<class T>il void rd(T &x){
        char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
        for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);}
    template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');}
    template<class T>il void ot(T x){if(x<0) putchar('-'),x=-x;output(x);putchar(' ');}
    template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('
    ');}
    namespace Modulo{
    const int mod=998244353;
    int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
    void inc(int &x,int y){x=ad(x,y);}
    int mul(int x,int y){return (ll)x*y%mod;}
    void inc2(int &x,int y){x=mul(x,y);}
    int qm(int x,int y=mod-2){int ret=1;while(y){if(y&1) ret=mul(x,ret);x=mul(x,x);y>>=1;}return ret;}
    }
    //using namespace Modulo;
    namespace Miracle{
    const int N=1e5+5;
    int du[N],n;
    vector<int>to[N];
    int fa[N],ans;
    bool vis[N],has[N];
    void dfs(int x){
        for(solid y:to[x]){
            if(y==fa[x]) continue;
            fa[y]=x;
            dfs(y);
        }
    }
    int main(){
        rd(n);int x,y;
        int rt=0;
        for(reg i=1;i<n;++i){
            rd(x);rd(y);++x;++y;
            to[x].pb(y);to[y].pb(x);
            ++du[x];++du[y];
            if(du[x]>2) rt=x;
            if(du[y]>2) rt=y;
        }
        if(!rt) printf("1");
        else{
            dfs(rt);
            for(reg i=1;i<=n;++i){
                if(du[i]==1){
                    // cout<<" ii "<<i<<endl;
                    int x=i;
                    while(du[fa[x]]<=2) x=fa[x];
                    // cout<<" xx "<<x<<endl;
                    if(!has[fa[x]]){
                        has[fa[x]]=1;
                    }else{
                        if(!vis[x]){
                            vis[x]=1;
                            ++ans;
                        }
                    }
                }
            }
            ot(ans);
        }
        return 0;
    }
    
    }
    signed main(){
        Miracle::main();
        return 0;
    }
    
    /*
       Author: *Miracle*
    */
  • 相关阅读:
    c#下实现ping操作
    DevExpress 经典常用功能代码收集
    WPF – 使用触发器
    XtraGrid使用方法
    [读书笔记]STL源码剖析
    [微软面试100题]6170
    [读书笔记]Thinking in C++
    [转][算法]google page rank算法
    [微软面试100题]7180
    [转][算法]链接分析算法之:HITS算法
  • 原文地址:https://www.cnblogs.com/Miracevin/p/10971441.html
Copyright © 2011-2022 走看看