【BZOJ】【1086】 【SCOI2005】王室联邦

树分块

  orz vfk && PoPoQQQ

  http://vfleaking.blog.163.com/blog/static/174807634201231684436977/
  http://blog.csdn.net/popoqqq/article/details/42772237

  这题是要把树分成一块一块的……(感觉好像不是原来理解的树分块处理操作啊……)

  每块大小B<= size <=3B ,一种简单粗暴的想法就是dfs,每找到B个就分一块,但是这样连通性不能保证(一颗子树的下半截和另一棵子树的上半截组成一块)。所以我们就想:能不能从底部往上组块,每棵子树较深的部分自己成块,然后靠近根的部分组成一个大块

  这样就可以保证连通性和块大小不会超了,最后dfs结束后肯定还会有剩余的未组成块的节点,把它们归到最后一个块就可以了。证明看vfk博客就行……

  至于实现这个“等待序列”,用的是PoPoQQQ的方法:用栈来实现,对当前节点x,它的等待序列就是bottom--top(bottom初始化为top,然后再向栈里加的元素就是他的儿子)……呃……这个自己手画一个简单的就能理解了吧……?或者脑补一下……嗯

 1 /**************************************************************
 2     Problem: 1086
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:12 ms
 7     Memory:1320 kb
 8 ****************************************************************/
 9  
10 //BZOJ 1086
11 #include<cstdio>
12 #include<cstring>
13 #include<cstdlib>
14 #include<iostream>
15 #include<algorithm>
16 #define rep(i,n) for(int i=0;i<n;++i)
17 #define F(i,j,n) for(int i=j;i<=n;++i)
18 #define D(i,j,n) for(int i=j;i>=n;--i)
19 using namespace std;
20 void read(int &v){
21     v=0; int sign=1; char ch=getchar();
22     while(ch<'0'||ch>'9'){ if (ch=='-') sign=-1; ch=getchar();}
23     while(ch>='0'&&ch<='9'){ v=v*10+ch-'0'; ch=getchar();}
24     v*=sign;
25 }
26 /******************tamplate*********************/
27 const int N=2015;
28 int head[N],to[N],next[N],cnt;
29 void add(int x,int y){
30     to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt;
31     to[++cnt]=x; next[cnt]=head[y]; head[y]=cnt;
32 }
33 /********************edge***********************/
34 int n,B,K;
35 int st[N],top;
36 int belong[N],root[N],tot;
37 void dfs(int x,int fa){
38     int bottom=top;
39     for(int i=head[x];i;i=next[i])
40         if (to[i]!=fa){
41             dfs(to[i],x);
42             if (top-bottom>=B){
43                 root[++tot]=x;
44                 while(top!=bottom)
45                     belong[st[top--]]=tot;
46             }
47         }
48     st[++top]=x;
49 }
50  
51 int main(){
52     read(n); read(B);
53     int x,y;
54     F(i,2,n){
55         read(x); read(y);
56         add(x,y);
57     }
58     dfs(1,0);
59     while(top) belong[st[top--]]=tot;
60     printf("%d\n",tot);
61     F(i,1,n) printf("%d ",belong[i]);
62     printf("\n");
63     F(i,1,tot) printf("%d ",root[i]);
64     return 0;
65 }
View Code

 

1086: [SCOI2005]王室联邦

Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge
Submit: 752  Solved: 416
[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

HINT

Source

[Submit][Status][Discuss]

转载于:https://www.cnblogs.com/Tunix/p/4247955.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红黑树和平衡二叉树的区别_面试题精选红黑树(c/c++版本)

红黑树的使用场景非常广泛&#xff0c;比如nginx中用来管理timer、epoll中用红黑树管理事件块&#xff08;文件描述符&#xff09;、Linux进程调度Completely Fair Scheduler用红黑树管理进程控制块、CSTL中map,set的底层实现全是用的红黑树。掌握红黑树的原理以及使用场景&…

linux中按行读取文件,Linux按行读取文件内容

方法1&#xff1a;while循环中执行效率最高&#xff0c;最常用的方法。function while_read_LINE_bottm(){While read LINEdoecho $LINEdone < $FILENAME}#!/bin/bashwhile read linedoecho $linedone < filename(待读取的文件)注释&#xff1a;习惯把这种方式叫做read釜…

酱油和gbt酱油哪个好_酱油越贵越好?认准瓶身这4处,轻松挑到好酱油!

买酱油这件事&#xff0c;爷叔阿姨们都不陌生。现在市面上酱油品种很多&#xff0c;除了普通的生抽、老抽以外&#xff0c;还有些别的口味&#xff0c;比如海鲜酱油、菌菇酱油等等&#xff0c;价格比普通的还高出不少&#xff0c;这些酱油真的更鲜更好吗&#xff1f;买酱油的2大…

linux网站465端口是什么端口,发送端口25,465,587端口疑问解答

25端口(SMTP)&#xff1a;25端口为SMTP(Simple Mail Transfer Protocol&#xff0c;简单邮件传输协议)服务所开放的&#xff0c;是用于发送邮件。如今绝大多数邮件服务器都使用该协议。当你给别人发送邮件时&#xff0c;你的机器的某个动态端口(大于1024)就会与邮件服务器的25号…

uml 时序图_程序猿都应学习的语言:看 25 张图学 UML

作者 | 逸珺责编 | 屠敏来源 | 嵌入式客栈作为程序猿都最好掌握的一门语言&#xff0c;那就是UML(Unified Modeling Language)&#xff0c;统一建模语言(UML)是软件工程领域中一种通用的开发建模语言&#xff0c;旨在提供一种可视化系统设计的标准方法。是开发人员、系统设计人…

新服务器的配置

新服务器的安装好那三款软件后还是打不开会报错&#xff0c;去服务器管理网站增加执行权即可。 转载于:https://www.cnblogs.com/longhun/p/4266665.html

Linux下好用的日志库,我使用過的Linux命令之tailf - 跟蹤日志文件/更好的tail -f版本...

用途說明tailf命令幾乎等同於tail -f&#xff0c;嚴格說來應該與tail --followname更相似些。當文件改名之后它也能繼續跟蹤&#xff0c;特別適合於日志文件的跟蹤(follow the growth of a log file)。與tail -f不同的是&#xff0c;如果文件不增長&#xff0c;它不會去訪問磁盤…

Android学习笔记(四十):Preference的使用

Preference直译为偏好&#xff0c;博友建议翻译为首选项。一些配置数据&#xff0c;一些我们上次点击选择的内容&#xff0c;我们希望在下次应用调起的时候依旧有效&#xff0c;无须用户再一次进行配置或选择。Android提供preference这个键值对的方式来处理这样的情况&#xff…

telegr怎么连接不上_无线网密码正确但是手机连接不上wifi?

现在企业、家庭、餐厅、宾馆到处都有WiFi无线网络信号&#xff0c;为大家的电脑、手机提供免费的无线网络服务&#xff0c;但是有的时候明明有信号而无线网密码正确却连不上&#xff0c;是多么痛苦的一件事情。那么无线网密码正确但是手机连接不上wifi怎么回事&#xff1f;下面…

hdu3652(数位dp)

要求找出范围内含有“13”且能被13整除的数字的个数 可以使用数位dp dp[i][j][0] 表示长度为i&#xff0c;余数为j&#xff0c;不含13的数字的个数 dp[i][j][1] 表示长度为i&#xff0c;余数为j&#xff0c;3开头的数字的个数 dp[i][j][2] 表示长度为i&#xff0c;余数为j&…

怎么查看电脑是不是禁ping_怎么查看电脑内存的大小,找回丢失的内存,电脑小技巧...

小A自己组装了一台电脑&#xff0c;配件都是在jd买了。他高高兴兴的安装了系统准备开始体验一把&#xff0c;同事突然问&#xff0c;你的电脑内存是多少&#xff0c;他点来点去也没找到答案。他只知道他买了一个8G的内存条。.我们一般查看内存有两个地方。一我们的电脑 属性 安…

finereport字段显示设置_QA | 表单如何设置字段显示逻辑?

Hi&#xff0c;大家好&#xff01;表姐又来给大家答疑解惑啦&#xff01;这一期的Q&A我们来聊聊表单如何设置字段显示逻辑。字段显示逻辑是什么&#xff1f;字段显示逻辑是指根据设定字段条件&#xff0c;显示或隐藏特定的字段&#xff0c;可以实现选择不同内容&#xff0c…

数据库管理之数据表管理(1)

数据类型 创建数据表 语法 CREATE TABLE 表名 ( 字段名1 数据类型 列的属性 列约束, 字段名2 数据类型 列的属性 列约束, 字段名3 数据类型 列的属性 列约束, … )列属性的格式&#xff1a; [NULL|NOT NULL] [IDENTITY(标识种子, 标识增量)]列约束的格式&#xff1a; [CONST…

AngularJs-指令和指令之间的交互(动感超人)

前言&#xff1a; 上节我们学习到了指令和控制器之间的交互&#xff0c;通过给指令添加动作&#xff0c;调用了控制器中的方法。本节我们学习指令和指令之间是如何交互的&#xff0c;我们通过一个小游戏来和大家一起学习&#xff0c;听大漠老师说这是国外的人写的demo&#xff…

vba 指定列后插入列_在不同的列左侧插入指定数量的空白列

任务: 在不同的列左侧插入指定数量的空白列(本例是要求在每列左侧插入第2行数字对应的空白列) 插入空白列前 插入空白列后 vba代码如下&#xff1a; Sub 在不同的列左侧插入指定数量的空白列() Dim m, n, i As Integer For n 5 To 1 Step -1 Sheets("Sheet1").C…

怎么监听linux防火墙,linux怎么查看防火墙是否开启并清除防火墙规则?

iptables是linux下的防火墙组件服务&#xff0c;相对于windows防火墙而言拥有更加强大的功能&#xff0c;下面我们就来看看linux系统中关于iptables的一般常见操作&#xff0c;判断linux系统是否启用了iptables服务&#xff0c;并清除防火墙规则的教程。一、检查iptables是否安…

手册如何看运放的db_如何处理金属离子与配体之间的配位键?

更多资讯&#xff0c;请访问www.yinfotek.com 或关注微信公众号“殷赋科技”。殷赋学术交流2群已建立&#xff0c;需求加群的朋友&#xff0c;请在公众号输入“加群”&#xff0c;验证后即入群。1A:请教大家一个问题&#xff1a;在做对接模拟的过程中蛋白活性中心存在重要金属离…

secure连不上远程地址_[笔记]Mariadb安装并配置远程访问

引言熟悉的小伙伴都知道我自用有一台NAS&#xff0c;并为此折腾了不少内容&#xff1a;西蒙宫&#xff1a;折腾&#xff0c;用J3455搭建家庭nas西蒙宫&#xff1a;让家庭NAS走向世界&#xff0c;兼谈Zerotier西蒙宫&#xff1a;折腾——组装NAS编译安装ffmpeg在NAS上部署了Next…

从Wireshark看TCP连接的建立与关闭

TCP是一种面向连接、可靠的协议。TCP连接的建立与断开&#xff0c;都是需要经过通信双方的协商。用一句话概括就是&#xff1a;三次握手say hello&#xff08;建立连接&#xff09;&#xff1b;四次握手say goodbye&#xff08;断开连接&#xff09;。要了解TCP连接的建立与断开…

用Visual C#来清空回收站(2)

四.程序的源代码&#xff08;recycled.cs&#xff09;、编译方法及运行后的界面&#xff1a;  &#xff08;1&#xff09;.程序的源代码&#xff1a;recycled.cs&#xff1a; using System.IO ; using System.Windows.Forms ; //导入程序中用到的名称空间 class Recycle { pu…