【题解】

  我们可以发现叶子节点的关联点一定是它的父亲节点,那么我们dfs一遍就可以求出所有节点的关联点,或者判断出无解。

  对于每个点i,它的关联点u的危险度肯定比它连接的其他点vi的危险度小,我们从u向vi连边。

  连边之后我们跑拓扑排序,并且用堆维护当前入度为0的点中编号最小的,以此来让字典序最小。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define LL long long
#define rg register
#define N 1000010
using namespace std;
int n,tot,cnt,last[N],last2[N],link[N],in[N],q[N],ans[N];
bool vis[N],sol=;
struct edge{int to,pre;}e[N<<],e2[N<<];
priority_queue<int,vector<int>,greater<int> >f;
char buf[],*ptr=buf-;
inline int read(){
int f=,k=; char c=*++ptr;
while(c<'' || c>'') c=='-'&&(f=-), c=*++ptr;
while(c<='' && c>='') k=k*+c-'', c=*++ptr;
return k*f;
}
void dfs(int x,int fa){
if(!sol) return;
bool ok=;
for(rg int i=last[x],to;i;i=e[i].pre)if((to=e[i].to)!=fa){
dfs(to,x); if(!vis[to]) link[x]=to,vis[to]=,ok=;
}
if(!ok){
if(vis[fa]) sol=;
else link[x]=fa,vis[fa]=;
}
}
void dfs2(int x,int fa){
int u=link[x];
for(rg int i=last[x],to;i;i=e[i].pre)if((to=e[i].to)!=link[x]){
in[to]++;
e2[++tot]=(edge){to,last2[u]}; last2[u]=tot;
// printf("%d-->%d\n",u,to);
}
for(rg int i=last[x],to;i;i=e[i].pre)if((to=e[i].to)!=fa) dfs2(to,x);
}
int main(){
// freopen("minecraft.in","r",stdin);
// freopen("minecraft.out","w",stdout);
fread(buf, , sizeof(buf), stdin);
n=read();
for(rg int i=;i<n;i++){
int u=read(),v=read();
e[++tot]=(edge){v,last[u]}; last[u]=tot;
e[++tot]=(edge){u,last[v]}; last[v]=tot;
}
vis[]=;
dfs(,);
if(!sol){puts("-1"); return ;}
// for(rg int i=1;i<=n;i++) printf("%d ",link[i]); puts("link");
tot=;
dfs2(,);
// for(rg int i=1;i<=n;i++) printf("%d ",in[i]); puts("in");
for(rg int i=;i<=n;i++)if(!in[i]){
f.push(i);
}
while(f.size()){
int now=f.top(); f.pop();
ans[++cnt]=now;
for(rg int i=last2[now],to;i;i=e2[i].pre){
in[to=e2[i].to]--;
if(!in[to]) f.push(to);
}
}
for(rg int i=;i<=n;i++) printf("%d ",ans[i]);
return ;
}

做法二:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define LL long long
#define rg register
#define N 500010
using namespace std;
int n,m,tot,ans[N],last[N],deg[N];
bool vis[N],cut[N<<];
struct edge{
int to,pre;
}e[N<<];
priority_queue<int,vector<int>,greater<int> >q;
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
int main(){
n=read(); tot=;
if(n==) return puts("-1"),;
for(rg int i=;i<n;i++){
int u=read(),v=read();
e[++tot]=(edge){u,last[v]}; last[v]=tot;
e[++tot]=(edge){v,last[u]}; last[u]=tot;
deg[u]++; deg[v]++;
}
for(rg int i=;i<=n;i++)if(deg[i]<=) q.push(i),vis[i]=;
for(rg int t=,now;t<=n;t++){
if(!q.size()){puts("-1"); return ;}
ans[t]=now=q.top(); q.pop();
for(rg int i=last[now],to;i;i=e[i].pre)if(!cut[i]){
to=e[i].to;
for(rg int j=last[to],to2;j;j=e[j].pre){
deg[to2=e[j].to]--;
if(!vis[to2]&&deg[to2]<=) q.push(to2),vis[to2]=;
cut[j^]=;
}
}
}
for(rg int i=;i<=n;i++) printf("%d ",ans[i]);
return ;
}

「LibreOJ β Round #3」绯色 IOI(抵达)的更多相关文章

  1. [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)

    [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 …… 接着他们发现自己收 ...

  2. loj #547. 「LibreOJ β Round #7」匹配字符串

    #547. 「LibreOJ β Round #7」匹配字符串   题目描述 对于一个 01 串(即由字符 0 和 1 组成的字符串)sss,我们称 sss 合法,当且仅当串 sss 的任意一个长度为 ...

  3. [LOJ#531]「LibreOJ β Round #5」游戏

    [LOJ#531]「LibreOJ β Round #5」游戏 试题描述 LCR 三分钟就解决了问题,她自信地输入了结果-- > -- 正在检查程序 -- > -- 检查通过,正在评估智商 ...

  4. [LOJ#530]「LibreOJ β Round #5」最小倍数

    [LOJ#530]「LibreOJ β Round #5」最小倍数 试题描述 第二天,LCR 终于启动了备份存储器,准备上传数据时,却没有找到熟悉的文件资源,取而代之的是而屏幕上显示的一段话: 您的文 ...

  5. [LOJ#516]「LibreOJ β Round #2」DP 一般看规律

    [LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...

  6. [LOJ#515]「LibreOJ β Round #2」贪心只能过样例

    [LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...

  7. [LOJ#525]「LibreOJ β Round #4」多项式

    [LOJ#525]「LibreOJ β Round #4」多项式 试题描述 给定一个正整数 k,你需要寻找一个系数均为 0 到 k−1 之间的非零多项式 f(x),满足对于任意整数 x 均有 f(x) ...

  8. [LOJ#526]「LibreOJ β Round #4」子集

    [LOJ#526]「LibreOJ β Round #4」子集 试题描述 qmqmqm有一个长为 n 的数列 a1,a2,……,an,你需要选择集合{1,2,……,n}的一个子集,使得这个子集中任意两 ...

  9. LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力

    二次联通门 : LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 /* LibreOJ #517. 「LibreOJ β Round #2」计算几何瞎暴力 叫做计算几 ...

随机推荐

  1. IO流案例:1.复制多级文件夹 2.删除多级文件夹

    package copy; /* 需求:复制多级文件夹 复制d:\\itcast(包含文件和子文件夹)到模块目录下 分析: d:\\itcast a.txt b.txt javaweb a.xml b ...

  2. web.xml中classpath*:与classpath:的区别

    classpath对应src目录,该目录下的文件会在编译后被存放到WEB-INF文件夹下的classes目录. classpath:只会到你的class路径中查找配置文件,对于多个同名的配置文件,只会 ...

  3. sybase修改默认字符集为cp936

    原文地址:http://blog.sina.com.cn/s/blog_4d6854860100xn3f.html 报错信息:2402 error converting characters into ...

  4. background-size属性

    background-size:属性有 auto:length :百分比 length 如:10px 20px 固定的 或者是写成一个 ,10px  另外一个就默认为 auto; 写成百分比的形式 是 ...

  5. 141 Linked List Cycle 环形链表

    给定一个链表,判断链表中否有环.补充:你是否可以不用额外空间解决此题?详见:https://leetcode.com/problems/linked-list-cycle/description/ J ...

  6. Oracle及其相关软件历史版本下载地址

    https://edelivery.oracle.com/osdc/faces/Home.jspx 打开上面这个链接,输入自己或可用的帐号即可. 搜索到自己想要下载的软件后,点击,软件会添加到购物车中 ...

  7. Suricata的规则解读(默认和自定义)

    不多说,直接上干货! 见suricata官网 https://suricata.readthedocs.io/en/latest/rules/index.html 一.Suricata的规则所放位置 ...

  8. js数组去重的三种方式的比较

    做前端的,一般实现功能是主要的,但是重中之重却是在做到功能完善的情况下提高性能. 1.遍历数组法 实现的思路:构建一个新的数组存放结果,for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组 ...

  9. NodeJS&&前端思考

    做大型软件(工程化): 1.测试相关 tdd / bdd 测试覆盖率 2.规范化 standard.各种 lint.hint 3.构建相关 gulp.grunt.webpack,大量插件 4.生成器 ...

  10. Ajax的项目搭建

    在搭建Ajax项目之前,首先我们的安装nginx,因为Ajax是基于nginx来运行的, 1.安装nginx 和基本的语法 http://nginx.org/ 上面的nginx的官网,下载直接安装就好 ...