You are given a rooted tree with vertices numerated from 1 to n

. A tree is a connected graph without cycles. A rooted tree has a special vertex named root.

Ancestors of the vertex i

are all vertices on the path from the root to the vertex i, except the vertex i itself. The parent of the vertex i is the nearest to the vertex i ancestor of i. Each vertex is a child of its parent. In the given tree the parent of the vertex i is the vertex pi. For the root, the value pi is −1

.

An example of a tree with n=8

, the root is vertex 5. The parent of the vertex 2 is vertex 3, the parent of the vertex 1 is vertex 5. The ancestors of the vertex 6 are vertices 4 and 5, the ancestors of the vertex 7 are vertices 8, 3 and 5

You noticed that some vertices do not respect others. In particular, if ci=1

, then the vertex i does not respect any of its ancestors, and if ci=0

, it respects all of them.

You decided to delete vertices from the tree one by one. On each step you select such a non-root vertex that it does not respect its parent and none of its children respects it. If there are several such vertices, you select the one with the smallest number. When you delete this vertex v

, all children of v become connected with the parent of v

.

An example of deletion of the vertex 7

.

Once there are no vertices matching the criteria for deletion, you stop the process. Print the order in which you will delete the vertices. Note that this order is unique.

Input

The first line contains a single integer n

(1≤n≤105

) — the number of vertices in the tree.

The next n

lines describe the tree: the i-th line contains two integers pi and ci (1≤pi≤n, 0≤ci≤1), where pi is the parent of the vertex i, and ci=0, if the vertex i respects its parents, and ci=1, if the vertex i does not respect any of its parents. The root of the tree has −1 instead of the parent index, also, ci=0 for the root. It is guaranteed that the values pi define a rooted tree with n

vertices.

Output

In case there is at least one vertex to delete, print the only line containing the indices of the vertices you will delete in the order you delete them. Otherwise print a single integer −1

.

Examples

Input
5
3 1
1 1
-1 0
2 1
3 0
Output
1 2 4
Input
5
-1 0
1 1
1 1
2 0
3 0
Output
-1
Input
8
2 1
-1 0
1 0
1 1
1 1
4 0
5 1
7 0
Output
5

Note

The deletion process in the first example is as follows (see the picture below, the vertices with ci=1

are in yellow):

  • first you will delete the vertex 1

, because it does not respect ancestors and all its children (the vertex 2) do not respect it, and 1

  • is the smallest index among such vertices;
  • the vertex 2

will be connected with the vertex 3

  • after deletion;
  • then you will delete the vertex 2

, because it does not respect ancestors and all its children (the only vertex 4

  • ) do not respect it;
  • the vertex 4

will be connected with the vertex 3

  • ;
  • then you will delete the vertex 4
  • , because it does not respect ancestors and all its children (there are none) do not respect it (vacuous truth);
  • you will just delete the vertex 4
  • ;
  • there are no more vertices to delete.

In the second example you don't need to delete any vertex:

  • vertices 2

and 3

  • have children that respect them;
  • vertices 4

and 5

  • respect ancestors.

In the third example the tree will change this way:

题意:输入一个n,接下来n行,每行2个数pi表示第i个结点的父结点,ci为1表示这个结点不尊重他的祖先,为0表示它尊重祖先
对于一个非根结点,如果它不尊重祖先且其孩子不尊重它,则它被删掉且它的孩子连到它的父结点上,输出被删去的结点编号
思路:一开始想如果一个结点被删除就等价于它被它的孩子结点代替,所以如果删除一个结点后就打上删除标记,访问一个被删去的结点时就去访问它的儿子碰到儿子时被删除的结点就递归地访问直到没有一个结点是要被删除的
这样dfs模拟,但这样在test10超时了.其实如果一个结点不尊重祖先,但它的孩子尊重它,则他是不能删的,所以对于一个不尊重祖先但被孩子尊重的结点从它的父结点开始连续的不尊重祖先的结点都是需要删掉的,
所以我们先把不尊重祖先的结点标记,再标记出不尊重祖先但被孩子尊重的结点,最后输出不尊重祖先且不被孩子尊重的结点
注意这里是先标记了不尊重祖先的结点,才看那些是不尊重祖先但被孩子尊重的结点,如果在标记不尊重祖先的结点的同时看那些结点被孩子标记,可能会出现现在这个结点的孩子没被标记为不尊重祖先的结点,但后面的输入是被标记了,这样就错误的把当前这个结点标记为不尊重祖先但被孩子尊重的结点

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
typedef long long ll;
const int amn=1e5+;
int n,ans[amn],p[amn],c[amn],root;
int main(){
int need[amn];
memset(need,,sizeof need);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&p[i],&c[i]);
if(p[i]==-)root=i;
if(c[i])need[i]=;
}
for(int i=;i<=n;i++){
if(!c[i])need[p[i]]=;
}
int tp=;
for(int i=;i<=n;i++){
if(!need[i]||i==root)continue;
if(c[i]&&need[i])
ans[++tp]=i;
}
if(tp){
for(int i=;i<=tp;i++)printf("%d%c",ans[i],i<tp?' ':'\n');
}
else printf("-1\n");
}
/**
题意:输入一个n,接下来n行,每行2个数pi表示第i个结点的父结点,ci为1表示这个结点不尊重他的祖先,为0表示它尊重祖先
对于一个非根结点,如果它不尊重祖先且其孩子不尊重它,则它被删掉且它的孩子连到它的父结点上,输出被删去的结点编号
思路:一开始想如果一个结点被删除就等价于它被它的孩子结点代替,所以如果删除一个结点后就打上删除标记,访问一个被删去的结点时就去访问它的儿子碰到儿子时被删除的结点就递归地访问直到没有一个结点是要被删除的
这样dfs模拟,但这样在test10超时了.其实如果一个结点不尊重祖先,但它的孩子尊重它,则他是不能删的,所以对于一个不尊重祖先但被孩子尊重的结点从它的父结点开始连续的不尊重祖先的结点都是需要删掉的,
所以我们先把不尊重祖先的结点标记,再标记出不尊重祖先但被孩子尊重的结点,最后输出不尊重祖先且不被孩子尊重的结点
注意这里是先标记了不尊重祖先的结点,才看那些是不尊重祖先但被孩子尊重的结点,如果在标记不尊重祖先的结点的同时看那些结点被孩子标记,可能会出现现在这个结点的孩子没被标记为不尊重祖先的结点,但后面的输入是被标记了,这样就错误的把当前这个结点标记为不尊重祖先但被孩子尊重的结点
**/

[尊老爱幼] Queen的更多相关文章

  1. ACM: Long Live the Queen - 树上的DP

    Long Live the Queen Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u D ...

  2. 皇后(queen)

    皇后(queen)[题目描述] 众所不知,rly现在不会玩国际象棋.但是,作为一个OIer,rly当然做过八皇后问题.这里再啰嗦几句,皇后可以攻击到同行同列同对角线,在n*n的方格中摆n个皇后使其互不 ...

  3. 1976 Queen数列

    1976 Queen数列  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 将1到N的整数数列(1 ...

  4. Uva 11538 - Chess Queen

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  5. 组合数学 UVa 11538 Chess Queen

    Problem A Chess Queen Input: Standard Input Output: Standard Output You probably know how the game o ...

  6. uva 10401 Injured Queen Problem(dp)

    题目链接:10401 - Injured Queen Problem 题目大意:给出一个字符串,要求在n * n(n为字符串的长度)的棋盘上摆放n个受伤的皇后,受伤的皇后只能攻击到同一列和它周围8个格 ...

  7. C. Queen Codeforces Round #549 (Div. 2) dfs

    C. Queen time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  8. 高可用OpenStack(Queen版)集群-1. 集群环境

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  9. 143. Long Live the Queen 树形dp 难度:0

    143. Long Live the Queen time limit per test: 0.25 sec. memory limit per test: 4096 KB The Queen of ...

随机推荐

  1. Excel技巧:如何绘制一份优秀的甘特图(项目管理)

    作者:秦路,天善智能特约专家.资深数据分析师,数据化运营专家.擅长结合运营和数据,建立数据化运营体系. 个人公众号:秦路(微信ID:tracykanc) 今天我给大家分享的内容是如何利用Excel绘制 ...

  2. Jun

    Contents 数据来源 代码演示 讨论 一.数据来源 为了节省时间,我直接用了官方所给的数据,分别是雄性和雌性小鼠的肝脏芯片数据 Female Data Male Data 二.代码演示 数据输入 ...

  3. 《HelloGitHub》第 47 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  4. SpringCloud Ribbon组成和负载均衡规则

    Ribbon饥饿加载 默认情况下Ribbon是懒加载的.当服务起动好之后,第一次请求是非常慢的,第二次之后就快很多. 解决方式:开启饥饿加载 ribbon: eager-load: enabled: ...

  5. Elasticsearch系列---深入全文搜索

    概要 本篇介绍怎样在全文字段中搜索到最相关的文档,包含手动控制搜索的精准度,搜索条件权重控制. 手动控制搜索的精准度 搜索的两个重要维度:相关性(Relevance)和分析(Analysis). 相关 ...

  6. Magisk了解以及简单的模块制作

    Magisk,就是刷机经常会需要使用的,也是就是我们说的面具或者脸谱.因为它的logo就是面具或者说脸谱.我们先简单了解一下: XDA上论坛的说明:Magisk - The Universal Sys ...

  7. Samtec 5G探索之路

    序言:时代在发展,2020年5G作为元年.5G全程第五代移动通信技术(英语:5th generation mobile networks或5th generation wireless systems ...

  8. Python几个简单实用的模块

    今天整理了下,工作中常用的一些高阶函数,后面持续更新...... 一.collections 二.itertools 三.functools

  9. layer打开弹窗时传递参数(content:)

    在使用layer打开弹窗时,我希望带一些参数过去,进行某些判断.直接就可以用链接+参数的方式即可. js var userGrade=Mrant layer.open({ title: '权限管理', ...

  10. http相关知识点回顾

    一.概述 1.什么是HTTP HTTP是一种可以获取HTML这样的网络资源的一种通讯协议protocol.是在WEB上进行数据交换的基础,是一种客户端--服务器协议.HTTP是一种可扩展的应用层协议, ...