zoukankan      html  css  js  c++  java
  • cf 321C

    题意:给一棵树,树上每个节点随便放置一个A-Z的字幕,A>B>C>....>Z,输出一种放置方案 使得任意两点之间的路径上有一个节点比两个节点的上的字母都大

    分析:第二个样例是一个链,给了我灵感,只要找到中间的一个点,然后向两边递减就好了,然后点分治就好了

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    using namespace std;
    const int maxn=1e5+5;
    int vis[maxn],n,_min,tsize[maxn],tssize[maxn],root;
    int head[maxn],to[maxn*2],edge[maxn*2],tot,dep[maxn],a,b,maxdep;
    
    void init(){
        memset(vis,0,sizeof(vis));
        maxdep=tot=0;
        memset(head,-1,sizeof(head));
    }
    
    void addedge(int u,int v){
        edge[tot]=v;
        to[tot]=head[u];
        head[u]=tot++;
    }
    //获取子树大小和子树的最大值
    void getsize(int u,int f){
        tsize[u]=1;tssize[u]=0;
        for(int i=head[u];i!=-1;i=to[i]){
            int v=edge[i];
            if(v==f||vis[v])continue;
            getsize(v,u);
            tsize[u]+=tsize[v];
            tssize[u]=max(tssize[u],tsize[v]);
        }
    }
    //重心
    void getroot(int r,int u,int f){
        tssize[u]=max(tssize[u],tsize[r]-tsize[u]);
        if(tssize[u]<_min)_min=tssize[u],root=u;
        for(int i=head[u];i!=-1;i=to[i]){
            int v=edge[i];
            if(v==f||vis[v])continue;
            getroot(r,v,u);
        }
    }
    
    void dfs(int u,int depth){
        _min=n;
        getsize(u,-1);
        getroot(u,u,-1);
        vis[root]=1;
        dep[root]=depth;
        maxdep=max(maxdep,depth);
        int qqq=root;
        for(int i=head[qqq];i!=-1;i=to[i]){
            int v=edge[i];
            if(vis[v])continue;
            dfs(v,depth+1);
        }
    }
    
    
    int main(){
        scanf("%d",&n);
        init();
        for(int i=1;i<n;i++){
            scanf("%d%d",&a,&b);
            addedge(a,b);
            addedge(b,a);
        }
        dfs(1,0);
        if(maxdep>=26){
            puts("Impossible!");
            return 0;
        }
        for(int i=1;i<=n;i++)printf("%c%c",dep[i]+'A',i==n?'
    ':' ');
        return 0;
    }
    
  • 相关阅读:
    java——base64 加密和解密
    BASE64Encoded() 方法报错说方法未定义
    java 实现HTTP连接(HTTPClient)
    如何关闭一些烦人的弹窗(总结)
    IDEA
    6、git和github
    5、预测和鉴定miRNA的靶基因
    4、在线blast比对结果解析(保守结构域)
    ASE分析
    3、Linux下配置Java环境
  • 原文地址:https://www.cnblogs.com/jihe/p/5962081.html
Copyright © 2011-2022 走看看