时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Hi有一棵N个节点的树,编号1-N,其中1号节点是整棵树的根。他把这棵树的N-1条边记录成N-1行,每行2个整数a和b,表示a是b的父节点。
喜欢恶作剧的小Ho在小Hi的记录里加了一行两个整数,于是小Hi不得设法找出这行可疑的记录。具体来说,如果去掉某一行之后,余下N-1行按小Hi的规则(a是b的父节点)恰好能构成一棵N个节点的树,并且满足编号恰好是1-N且1号节点是根,那么被去掉的一行就被视为可疑的。
你能帮小Hi找出所有可疑的记录吗?
输入
第一行包含一个整数N,表示树的节点数目。
以下N行每行两个整数a和b,表示a是b的父节点。
对于30%的数据,1 <= N <= 1000
对于100%的数据, 1 <= N <= 100000, 1 <= a, b <= N
输入保证合法。
输出
输出一行包含若干个从小到大的整数,表示可疑的行号。(行号从1开始)
-
样例输入
-
3 1 2 1 3 1 3
样例输出
-
2 3
题目简单。怀疑样例的输入给错了,最后一行输入应该是 2 3
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <vector> 5 #include <stack> 6 #include <set> 7 #include <map> 8 9 using namespace std; 10 11 12 int main() 13 { 14 int N; 15 int a, b; 16 cin >> N; 17 set<int>ss; 18 map<int, int>mm; 19 for (int i = 0; i < N; i++) 20 { 21 cin >> a >> b; 22 if (b == 1) 23 { 24 printf("%d", i + 1); 25 return 0; 26 } 27 int n = ss.size(); 28 ss.insert(b); 29 int n2 = ss.size(); 30 if (n == n2) 31 { 32 printf("%d %d", mm[b], i + 1); 33 return 0; 34 } 35 mm[b] = i + 1; 36 } 37 return 0; 38 }