题目描述

众所周知,Tom 猫对香肠非常感兴趣。有一天,Tom 家里的女主人赏给了Tom 一大堆香肠。这些香肠太多了,以至于Tom 一顿吃不完,于是它把这些香肠串成了一棵树,树的每个节点上都有一个香肠。

Tom 需要给这些香肠进行编号,其中有 aa 个香肠需要编号为 1,2,\cdots,a1,2,⋯,a 中的不重复的编号,作为早餐肠,剩下的 bb 个香肠需要编号为-1,-2,\cdots,-b−1,−2,⋯,−b中的不重复的编号,作为晚餐肠。

Tom 每天会随机吃一顿饭,可能是早饭,也可能是晚饭。如果是吃早饭,Tom 会吃掉编号绝对值最小的早餐肠,反之吃掉编号绝对值最小的晚餐肠。

如果一根香肠被吃掉了,那么与它相连的树上的边都会断掉,因此剩下的香肠可能会因此变成若干棵树,即变得不再连通。这是Tom 不希望发生的事。

请给这些香肠编号,使得无论Tom 如何安排早饭和晚饭,整棵树一直都是连通的。

输入格式

第一行三个正整数 n,a,bn,a,b,代表节点的数目,早餐肠的数目,晚餐肠的数目。保证 a + b = na+b=n

第二行开始,共 n-1n−1 行,每行两个正整数 u,vu,v,代表树上一条边。

输出格式

共 nn 行,第 ii 行输出第 ii 个节点的编号。

如果存在多种编号方式,请随意输出一种。如果不存在这样的编号方式,请输出 -1−1。

样例

样例输入1

6 3 3
1 2
2 3
2 4
4 5
4 6

样例输出1

1
3
2
-3
-2
-1

样例1 说明

编号后,无论如何安排早晚餐,香肠组成的树都是一直联通的。

另外,其它的编号方式也是可行的,比如2,3,1,-3,-1,-2 等。

样例2

下发了额外的一个大型样例文件。

数据范围与提示

测试点编号 n的范围 特殊性质
1-3 n \le 10n≤10
4 n \le 2000n≤2000
5,6,7 n \le 10^5n≤105 树是一条以1, n 为端点的链
8 n \le 10^5n≤105 a=1a=1
9,10 n \le 10^5n≤105

对于全部的数据,n \le 10^5, a + b = n,1 \le a, bn≤105,a+b=n,1≤a,b

来源

CSP-S 2019模拟 长沙一中2


Solution
因为某些sb错误爆零了
一个合法的方案一定是一棵大小为a或b的子树一种颜色,其他的另一种颜色。
于是dfs找子树再拓扑两次就好了。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define maxn 100005
using namespace std;
int n,a,b,head[maxn],tot,sz[maxn];
int F,pl,f[maxn],in[maxn],dfn[maxn],ed[maxn],dy[maxn],sc;
int col[maxn],flag[maxn];
queue<int>q;
struct node{
int v,nex;
}e[maxn*];
void add(int t1,int t2){
e[++tot].v=t2;e[tot].nex=head[t1];head[t1]=tot;
}
void dfs(int k,int fa){
sz[k]=;f[k]=fa;dfn[k]=++sc;dy[sc]=k;
for(int i=head[k];i;i=e[i].nex){
if(e[i].v==fa)continue;
dfs(e[i].v,k);
sz[k]+=sz[e[i].v];
}
ed[k]=sc;
if(sz[k]==a)F=,pl=k;
if(sz[k]==b)F=-,pl=k;
}
int main(){
cin>>n>>a>>b;
for(int i=,t1,t2;i<n;i++){
scanf("%d%d",&t1,&t2);
add(t1,t2);add(t2,t1);
in[t1]++;in[t2]++;
}
dfs(,);
if(!F){puts("-1");return ;}
for(int i=;i<=n;i++){
if(dfn[i]>=dfn[pl]&&dfn[i]<=ed[pl]){
flag[i]=;
if(in[i]==)q.push(i);
}
}
int now=;
while(!q.empty()){
int k=q.front();q.pop();col[k]=F*(++now);
for(int i=head[k];i;i=e[i].nex){
in[e[i].v]--;
if(in[e[i].v]==&&flag[e[i].v])q.push(e[i].v);
}
}
for(int i=;i<=n;i++)if(!flag[i]&&i!=f[pl]&&in[i]==)q.push(i);
in[f[pl]]=n;
now=;
while(!q.empty()){
int k=q.front();q.pop();col[k]=(-F)*(++now);
for(int i=head[k];i;i=e[i].nex){
in[e[i].v]--;
if(in[e[i].v]==&&!flag[e[i].v])q.push(e[i].v);
}
}
col[f[pl]]=(-F)*(++now);
for(int i=;i<=n;i++)printf("%d\n",col[i]);puts("");
return ;
}
 

tom的更多相关文章

  1. 解Tom大叔出的Javascript题目

    原文参考,http://www.cnblogs.com/TomXu/archive/2012/02/10/2342098.html Tom大叔的博客深入理解Javascript系列真是我们学习Java ...

  2. 组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix

    Tom and matrix Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=5226 Mean: 题意很简单,略. analy ...

  3. GDC2016【全境封锁(Tom Clancy's The Division)】对为何对应Eye Tracked System,以及各种优点的演讲报告

    GDC2016[全境封锁(Tom Clancy's The Division)]对为何对应Eye Tracked System,以及各种优点的演讲报告 原文 4Gamer編集部:松本隆一 http:/ ...

  4. TOM大叔的几道Javascript题目与解答

    几道JS题目 之前没有深入研究js语言,最近几年前端越来越工程化,需要扎实的js基础,看到博客园上有很多大牛分享JS学习文章,幸运看到tom大叔的blog,抽时间潜心学习了其文章,遇到到其出的几道题目 ...

  5. hdu-----(1507)Uncle Tom's Inherited Land*(二分匹配)

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  6. HDU 1507 Uncle Tom's Inherited Land*(二分图匹配)

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  7. hdu 5224 Tom and paper

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5224 Tom and paper Description There is a piece of pa ...

  8. Hdu 1507 Uncle Tom's Inherited Land* 分类: Brush Mode 2014-07-30 09:28 112人阅读 评论(0) 收藏

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  9. 华为上机:Tom的生日礼物

    Tom的生日礼物 描述: 四月一日快到了,Tom想了个愚人的好办法——送礼物.嘿嘿,不要想的太好,这礼物可没那么简单,Tom为了愚人,准备了一堆盒子,其中有一个盒子里面装了礼物.盒子里面可以再放零个或 ...

  10. ios的UIImage的两种不同的图片加载方式 tom猫

    在ios的UI交互设计时,对图片的处理是难免的:不同的处理方式会对内存有不同的影响: ********************************************************* ...

随机推荐

  1. Kubernetes tutorial - K8S 官方入门教程 中文翻译

    官方教程,共 6 个小节.每一小节的第一部分是知识讲解,第二部分是在线测试环境的入口. kubectl 的命令手册 原文地址 1 创建集群 1.1 使用 Minikube 创建集群 Kubernete ...

  2. LeetCode 129. Sum Root to Leaf Numbers 动态演示

    树的数值为[0, 9], 每一条从根到叶子的路径都构成一个整数,(根的数字为首位),求所有构成的所有整数的和 深度优先搜索,通过一个参数累加整数 class Solution { public: vo ...

  3. C++ STL:优先队列的使用详解

    堆是一个很重要的数据结构,那么我们如何更加简洁的去写大根/小根堆呢? 对于很多语言来说,只能一步一步手打,但是对于C++来说,写大根小根堆就简便得多,因为C++中有一个容器叫做priority_que ...

  4. javaweb的Filter过滤器设置全站编码

    FIlter配置全站编码有一种方法是重写getParameter方法,也就是继承HttpServletRequestWrapper在重写getParameter方法,还有一种就是如下: public ...

  5. vue.js2.0 (简易)水果商城 vuex vant-ui

    vue.js2.0 (简易)水果商城 vuex vant-ui:https://segmentfault.com/a/1190000015690250 vue2.5全家桶 高仿vivo商城 百分之95 ...

  6. <转载>面试官,不要再问我三次握手和四次挥手

    版权声明:本文为CSDN博主「夏雪冬日」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/hyg0811/a ...

  7. hdu5858 Hard problem(求两圆相交面积)

    题目传送门 Hard problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  8. TCL环境检查

    set w [open 1.txt w+] foreach a [info var] { if { [llength [array name $a]]==0 } { puts $w $a:[set $ ...

  9. Python之获取文件夹中文件列表以及glob与fnmatch模块的使用

    获取文件夹中的文件列表 print(os.listdir("../secondPackage")) # ['__init__.py', 'secondCookBook.py', ' ...

  10. RabbitMQ ——整体架构

    一 .概述 从整体上讲Rabbitmq就是一个生产者消费者的模型. 我们将中间的整个broker就当做是一个消息中间件的实体就可以了. 单从这个方面上讲,生产者发送消息到broker上面,然后消费者从 ...