zoukankan      html  css  js  c++  java
  • 1086: [SCOI2005]王室联邦

    (大概 打了5天比赛   学习计划 树上莫队一直都没来得及学 今天做了第一道树上分块的题  写挂了5,6次  许多细节没有注意到  慢慢改才发现 orz 继续加油

    1086: [SCOI2005]王室联邦

    Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge
    Submit: 2319  Solved: 1423
    [Submit][Status][Discuss]

    Description

      “余”人国的国王想重新编制他的国家。他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成
    员来管理。他的国家有n个城市,编号为1..n。一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条
    直接或间接的道路。为了防止管理太过分散,每个省至少要有B个城市,为了能有效的管理,每个省最多只有3B个
    城市。每个省必须有一个省会,这个省会可以位于省内,也可以在该省外。但是该省的任意一个城市到达省会所经
    过的道路上的城市(除了最后一个城市,即该省省会)都必须属于该省。一个城市可以作为多个省的省会。聪明的
    你快帮帮这个国王吧!

    Input

      第一行包含两个数N,B(1<=N<=1000, 1 <= B <= N)。接下来N-1行,每行描述一条边,包含两个数,即这
    条边连接的两个城市的编号。

    Output

      如果无法满足国王的要求,输出0。否则输出数K,表示你给出的划分方案中省的个数,编号为1..K。第二行输
    出N个数,第I个数表示编号为I的城市属于的省的编号,第三行输出K个数,表示这K个省的省会的城市编号,如果
    有多种方案,你可以输出任意一种。

    Sample Input

    8 2
    1 2
    2 3
    1 8
    8 7
    8 6
    4 6
    6 5

    Sample Output

    3
    2 1 1 3 3 3 3 2
    2 1 8
    #include <bits/stdc++.h>
    #define N 1005
    #define ll long long
    using namespace std;
    ll readll(){
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    int readint(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
        return f*x;
    }
    vector<int>vec[N];
    int n,b,cnt;
    int num[N],pre[N];
    int p[N],fp[N];
    bool vis[N];
    void dfs1(int v,int fa){
    	num[v]=1;pre[v]=fa;
    	for(int i=0;i<vec[v].size();i++){
    		int u=vec[v][i];
    		if(u!=fa){
    			dfs1(u,v);
    			num[v]+=num[u];
    		}
    	}
    	if(num[v]>=b){
    		if(num[v]<=2*b){
    			p[v]=cnt;fp[cnt]=v;num[v]=0;cnt++;vis[v]=1;
    		}
    		else{
    			int ans=0;
    			for(int i=0;i<vec[v].size();i++){
    				if(vec[v][i]==fa) continue;
    				ans+=num[vec[v][i]];
    				if(ans>=b){
    					fp[cnt]=v;p[vec[v][i]]=cnt;cnt++;num[v]-=ans;
    					ans=0;
    				}
    			}
    			if(!ans) p[v]=cnt-1,num[v]=0;
    			int t=0;
    			for(int i=vec[v].size()-1;i>=0;i--){
    				if(vec[v][i]==fa||vis[vec[v][i]]==1) continue;
    				if(p[vec[v][i]]) t=p[vec[v][i]];
    				else p[vec[v][i]]=t;
    				if(p[vec[v][i]]) num[vec[v][i]]=0,vis[vec[v][i]]=1;
    			}
    		}
    	}
    }
    void dfs2(int v){
    	for(int i=0;i<vec[v].size();i++){
    		int u=vec[v][i];
    		if(u!=pre[v]){
    			if(!p[u]) p[u]=p[v];
    			dfs2(u);
    		}
    	}
    }
    int main(){
    	ios::sync_with_stdio(false);
    	n=readint();b=readint();
    	int u,v;cnt=1;
    	for(int i=1;i<n;i++){
    		u=readint();v=readint();
    		vec[u].push_back(v);vec[v].push_back(u);
    	}
    	dfs1(1,-1);
    	cnt--;
    	if(!p[1]) p[1]=cnt;
    	dfs2(1);
    	printf("%d
    ",cnt);
    	for(int i=1;i<=n;i++) printf("%d ",p[i]);
    	printf("
    ");
    	for(int i=1;i<=cnt;i++) printf("%d ",fp[i]);
    	printf("
    ");
    	return 0;
    }
    

      

  • 相关阅读:
    svn cleanup failed–previous operation has not finished 解决方法
    开源SNS社区系统推荐
    从网络获取图片本地保存
    MS SQL Server 数据库连接字符串
    KeepAlive
    Configure Git in debian
    sqlserver query time
    RPi Text to Speech (Speech Synthesis)
    SQL Joins with C# LINQ
    search or reseed identity columns in sqlserver 2008
  • 原文地址:https://www.cnblogs.com/wang9897/p/8454622.html
Copyright © 2011-2022 走看看