在肖明

#神#
的推荐下,我尝试了这个题,一开始想的是暴力枚举所有的点,然后bfs层数,试着和肖明

#神#
说了这种方法之后,

#神#
轻蔑的一笑,说这不就是一个贪心么,你只需要先建树,然后从底下向上遍历,够了B个点就算作一个省。

#神#
的话让我豁然开朗,这个题貌似真的不是那么难诶。

然后
#神#
回去写作业了,蒟蒻我还在机房里思考

#神#
的话。仔细想了一下,发现这么贪心正确性显然。像

#神#
说的遍历树,然后当整棵树基本上快遍历完的时候,会出现剩下几个点不够B个的情况,然后就直接把他们连到根上,可以知道,因为我们之前是每个省都是B个城市,所以就算加到根上,根的那个省的城市还是会小于3\*B,所以这么就可以得出最优解。

然而书上的代码蒟蒻实现难度太高,,所以又借助了一下题解的力量。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define re register
#define maxn 1000007
#define ll long long
using namespace std;
struct po
{
int to,from,nxt;
};
po edge[];
int head[],n,m,B,b[],ans,t,rt[],fa,cnt,srk[],num,s;
inline void add_edge(int from,int to)
{
edge[++num].nxt=head[from];
edge[num].to=to;
head[from]=num;
}
inline void dfs(int u,int f)
{
int q=fa;
for(re int i=head[u];i;i=edge[i].nxt)
{
if(edge[i].to==f)
continue;
dfs(edge[i].to,u);
if(fa-q>=B)
{
cnt++;
rt[cnt]=u;
while(fa>q)
{
b[srk[fa--]]=cnt;
}
}
}
srk[++fa]=u;
}
int main()
{
cin>>n>>B;
for(re int i=;i<=n-;i++)
{
cin>>s>>t;
add_edge(s,t);
add_edge(t,s);
}
dfs(,);
while(fa)
{
b[srk[fa--]]=cnt;
}
cout<<cnt<<endl;
for(re int i=;i<=n;i++)
cout<<b[i]<<" ";
cout<<endl;
for(re int i=;i<=cnt;i++)
{
cout<<rt[i]<<" ";
}
return ;
}

【P2325】王室联邦(树的遍历+贪心)的更多相关文章

  1. BZOJ1086 王室联邦 —— 树分块

    题目链接:https://vjudge.net/problem/HYSBZ-1086 1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 16 ...

  2. bzoj1086 [SCOI2005]王室联邦 树分块

    [bzoj1086][SCOI2005]王室联邦 2014年11月14日2,6590 Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的 ...

  3. 【bzoj1086】[SCOI2005]王室联邦 树分块

    题目描述 将一棵n个点的树分为若干“块”,每个块满足:大小在B到3B之间,并且这个“块”添加某个点后连通.求方案. 输入 第一行包含两个数N,B(1<=N<=1000, 1 <= B ...

  4. 洛谷P2325王室联邦 SCOI2005 构造+树上分块

    正解:构造 解题报告: 照例先放传送门 umm其实我jio得这题应该在教树上莫队的时候港,应该是用来帮助理解树上莫队的分块方式的 然而这题是在学了树上分块之后再遇到的?就显得没那么难了吼 然后就随便说 ...

  5. P2325 [SCOI2005]王室联邦

    题目描述 “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不同的城市之间 ...

  6. P2325 [SCOI2005]王室联邦 解题报告

    P2325 [SCOI2005]王室联邦 题目描述 "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有\(n\) ...

  7. 【BZOJ-1086】王室联邦 分块 + 块状树

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1094  Solved: ...

  8. 【块状树】BZOJ 1086: [SCOI2005]王室联邦

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 826  Solved:  ...

  9. 洛谷P2325 [SCOI2005]王室联邦

    P2325 [SCOI2005]王室联邦 题目描述 "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有n个城市, ...

随机推荐

  1. sql 注入安全过滤-安全模块

    <?php /** * 安全模块 * Email:zhangyuan@tieyou.com * 主要针对xss跨站攻击.sql注入等敏感字符串进行过滤 * @author hkshadow */ ...

  2. Jqurey实现相似EasyUI的页面布局

    截图例如以下:(可通过移动中间蓝色的条.来改变左右两边div的宽度) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuZ21pbmd4aW5nOTgw ...

  3. Linux(Centos6.5)下安装svn服务器,并通过http访问

    linux安装svn其实很容易,个人觉得难就难在配置上,反复配置,琢磨,查找相关资料,总算是成功了.. 安装: 安装svn,一般情况下,选择yum方式安装还是比较简单的. ? 1 2 [root@mo ...

  4. 第四篇:了解 C++ 默默编写并调用的函数

    前言 对于一个类来说,最最基础的三类成员函数莫过于:构造函数,析构函数以及拷贝函数 (copy构造函数和=重载函数).即使你的类没有为这些函数做出定义,C++ 也会自动为你创建.本文将讲述的是 C++ ...

  5. 二、Android应用的界面编程(二)布局管理器

    一.线性布局所有布局都可以作为容器类使用,因此可以调用多个重载的addView()向布局管理器中添加组件.实际上,我们完全可以用一个布局管理器嵌套到其他布局管理器中---因为布局管理器也继承了View ...

  6. 常见cout格式输出

    cout.setf(ios::fixed);//设置格式 cout.unsetf(ios::fixed);//取消格式 cout.setf(ios::scientific);//科学记数法 cout. ...

  7. Consul文档收藏

    英文:https://www.consul.io/intro/getting-started/install.html 中文:http://www.liangxiansen.cn/2017/04/06 ...

  8. JQUERY几个操作action,随意记录

    .click:鼠标单击 .mouseenter 鼠标滑动

  9. 解决Oracle安装时报错“SID已在使用”办法

    1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务. 2. 开始->程序->Oracle - OraHome81->Oracle I ...

  10. [置顶] 我的Android进阶之旅------>Android中制作和查看自定义的Debug版本Android签名证书

    Android应用开发接入各种SDK时会发现,有很多SDK是需要靠package name和的证书指纹SHA1码来识别的,如百度地图SDK.这样如果使用默认自动生成的debug的话就会给开发调试工作带 ...