正题


题目大意

nnn个点的一棵树,给每一个点一个权值,每个点的依靠点是与它相连的权值最小的点,要求每个点最多只有一个依赖点。

求字典序最小的方案


解题思路

首先最小的一定是叶子结点,然后他的父节点指向他,因为它是叶子,所以他也指向他的父节点。这样我们每次可以得到一个点对。

对于每个点对,连左边的点都比右边的点大,连右边的点都比左边的点大,这样我们就可以得到一张大小关系的有向图。求字典序最小的拓扑序即可


codecodecode

#pragma GCC optimize(2)
%:pragma GCC optimize(3)
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=5e5+10;
priority_queue<int> q;
queue<int> p;
struct node{int to,next;
}a[N*2],e[N*2];
int n,in[N],ls[N],tot,w[N],rs[N],out[N],rest;
bool v[N];
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;in[y]++;return;
}
void adde(int x,int y){e[++tot].to=y;e[tot].next=rs[x];rs[x]=tot;out[y]++;return;
}
void combom(int x,int y){for(int i=ls[x];i;i=a[i].next){int z=a[i].to;if(z==y)continue;adde(y,z);in[z]--;if(in[z]==1)p.push(z);}for(int i=ls[y];i;i=a[i].next){int z=a[i].to;if(z==x)continue;adde(x,z);in[z]--;if(in[z]==1)p.push(z);}v[x]=v[y]=1;rest-=2;return;
}
void print(int x){if (x>9) print(x/10); putchar(x%10+48); return;
}
int main()
{scanf("%d",&n);if(n&1){printf("-1");return 0; }for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x); }tot=0;rest=n;for(int i=1;i<=n;i++)if(in[i]==1)p.push(i);for(int i=1;i<=n;i++){if(p.empty())break;int x=p.front();p.pop();if(v[x])continue;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(!v[y])combom(x,y);}}if(rest){printf("-1");return 0;}for(int i=1;i<=n;i++)if(!out[i])q.push(-i);while(!q.empty()){int x=-q.top();q.pop();print(x);putchar(' ');for(int i=rs[x];i;i=e[i].next){int y=e[i].to;out[y]--;if(out[y]==0)q.push(-y);}}return 0;
}

nssl1511-我的世界【堆,贪心】相关推荐

  1. |Tyvj|NOIP2004|堆|贪心|P1066 合并果子

    http://tyvj.cn/p/1066 贪心地先把所有果子放进小根堆,然后取出两个最小值相加后再放进去,在此期间ans+=两个最小值的和,直到只剩1个元素停止 #include<cstdio ...

  2. P7990-[USACO21DEC]Closest Cow Wins S【堆,贪心】

    正题 题目链接:https://www.luogu.com.cn/problem/P7990 题目大意 数轴上有kkk个点是草地,每个草地有不同收益,mmm个点是地方的点,现在你要放置nnn个我方的点 ...

  3. P4989-二进制之谜【堆,贪心】

    正题 题目链接:https://www.luogu.org/problemnew/show/P4989 题目大意 一个二进制数两两配对,要求 配对的数不能交叉(用同一个区间但不包含) 0在前1在后 要 ...

  4. jzoj1082-合并果子【堆,贪心】

    题目 有n堆大小不同的果子堆,每次合并两堆消耗它们两堆的重量之和,求把它们全部合并的最小消耗 输入 输入包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数.第二行包含 ...

  5. 【洛谷】【堆+贪心】P1484 种树

    [题目描述:] cyrcyr今天在种树,他在一条直线上挖了n个坑.这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树.而且由于cyrcyr的树种不够,他至多会种 ...

  6. [堆+贪心] CF596C. Wilbur and Points

    CF596C. Wilbur and Points 题意: 太难懂了.有一个平面点集,对集合中任意一点(x,y),满足以原点和(x,y)构成的矩形边上和内部的所有点也都在集合里. 现在要给点标号,为了 ...

  7. BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心

    1029: [JSOI2007]建筑抢修 Description 小刚在玩JSOI提供的一个称之为"建筑抢修"的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的 入侵者.但 ...

  8. 11.03 P73 模拟+堆+贪心

    第二题 问题描述 题解 代码 死亡 问题描述 题解 代码 凝视 问题描述 错的不严格题解 bug 代码 tips 每个测试点时限 1 秒 1 秒 1 秒 内存限制 512MB 512MB 512MB ...

  9. 【st表/猫树】【堆+贪心】超级钢琴

    [描述] 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中A ...

最新文章

  1. python编码格式
  2. AEM中的单元测试(大声思考)
  3. pythonclass全局变量_python的局部变量,全局变量,类变量,实例变量
  4. Workbench has not been created yet
  5. 本地tomcat启动war包_「shell脚本」懒人运维之自动升级tomcat应用(war包)
  6. java的property配置文件的用法
  7. 语言设有某种十年期国债_孩子的语言敏感期,家长应该做些什么呢?
  8. tensorflow之卷积神经网络
  9. java截取标签内容_Java 正则 , 截取两个标签之间字符串
  10. Ubuntu系统上使用锐捷客户端有线连接校园网
  11. 【20届考研终章--落幕】北京邮电大学软件学院--学硕
  12. HGET key field
  13. 笔记本计算机涂硅脂,笔记本电脑怎么涂cpu散热硅脂
  14. Project甘特图使用方法
  15. 北京现在软件学校计算机,计算机软件排名 计算机软件学校排名
  16. visionpro的无脚本和高级脚本(你要偷偷的卷,然后惊艳所有人)
  17. 互联神州---AK爆头战报
  18. git向多个分支push
  19. OllyDBG修改exe并保存运行
  20. 1 0 2 4 程序员防脱发指南

热门文章

  1. js 定时网页点击_反爬 JS 逆向,扣代码解密分析
  2. ios中amplify配置configure_Nginx源码编译安装及配置文件初步学习
  3. oracle取位置,获取oracle trace文件路径
  4. 项目管理六大制约因素_用PCTS理念做好项目管理规划(优秀项目管理者必知)...
  5. 中connect怎么用_烘焙中的各种酒,到底该怎么用?
  6. 百度广告点击软件_结束了,百度 “毒瘤” 广告!
  7. php中请写出定义变量的两种方法,php定义变量几种
  8. 哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之上——原理与设计
  9. qt 调用qpainter_在Qt5.4中如何实现QOpenGLWidget和QPainter混合编程
  10. windows 禁用ipv6服务_在 Windows 7 中禁用IPv6协议/IPv6隧道