zoukankan      html  css  js  c++  java
  • bzoj1086【SCOI2005】王室联邦

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1086

    sol  :这题水水啊,直接大力DFS就行了

       首先当且仅当x<B时无解

       对于以x为根的子树,如果未分配的siz[x]>B,则单独划出一个省

       其他未被分配的点随意就近分配就好了

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int Mx=1010;
    int n,k,top,ans,q[Mx],cap[Mx],belong[Mx],siz[Mx];
    int tot,head[Mx],nxt[2*Mx],ver[2*Mx];
    inline void add(int x,int y)
    {
        nxt[++tot]=head[x];
        ver[tot]=y;
        head[x]=tot;
    }
    void dfs1(int x,int fa)
    {
        q[++top]=x;
        for(int i=head[x];i;i=nxt[i])
        {
            int y=ver[i];
            if(y!=fa)
            {
                dfs1(y,x);
                if(siz[x]+siz[y]>=k)
                {
                    siz[x]=0;
                    cap[++ans]=x;
                    while(q[top]!=x) belong[q[top--]]=ans;
                }
                else siz[x]+=siz[y];
            }
        }
        siz[x]++;
    }
    void dfs2(int x,int fa,int tmp)
    {
        if(belong[x]) tmp=belong[x];
        else belong[x]=tmp;
        for(int i=head[x];i;i=nxt[i])
        {
            int y=ver[i];
            if(y!=fa)
                dfs2(y,x,tmp);
        }
    }
    void output()
    {
        cout<<ans<<endl;
        for(int i=1;i<=n;i++) cout<<belong[i]<<" ";cout<<endl;
        for(int i=1;i<=ans;i++) cout<<cap[i]<<" ";cout<<endl;
    }
    int main() 
    {
        scanf("%d%d",&n,&k);
        if(n<k) { cout<<"0"<<endl; return 0; }
        for(int i=1,x,y;i<n;i++)
        {
            scanf("%d%d",&x,&y);
            add(x,y),add(y,x);
        }
        dfs1(1,0); if(!ans) cap[++ans]=1;
        dfs2(1,0,ans);
        output();
        return 0;
    }
  • 相关阅读:
    HDU 4666 Hyperspace【最远曼哈顿距离+优先队列】
    Set集合容器
    堆排序实现
    手机网站调试神器之chrome控制台
    CC Sereja and Ballons (主席树)
    Multiset多重集合容器
    ZOJ 3626 Treasure Hunt I
    hdu 2072
    poj 3498 (最大流,枚举汇点)
    排序算法--冒泡排序
  • 原文地址:https://www.cnblogs.com/xiaoxubi/p/6479154.html
Copyright © 2011-2022 走看看