第一次做树的题,并且用到了vector,收获很大

#1507 : 可疑的记录

时间限制: 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
可疑的行肯定是根节点有父亲节点或者其他节点有两个父亲节点,那么就暴力检测一下,然后再检验一下去除这组关系后二叉树是否符合题目要求即可。
 
    
 
    
#include

using namespace std;
vector > vp[100001];
int vx[100001];
int vy[100001];
vector G[100001];  //建图 
int N;
int ans;
void dfs(int pos)
{
	ans++;  //每访问一个节点ans就++ 
	int i,j;
	for(i=0;i>N;
	for(i=1;i<=N;i++)
	{
		cin>>father>>son;
		vp[son].push_back(make_pair(father,i));
		vx[i]=father;
		vy[i]=son;
	}
	
	if(vp[1].size()!=0) //如果头结点有父亲节点,那么说明是可疑的 
	{
		printf("%d\n",vp[1][0].second);
	}
	else
	{
		for(i=1;i<=N;i++)
		{
			if(vp[i].size()>1)  //说明有两个父节点 ,那么接下来就是要看去除那个父节点可以符合题目要求 
			{
				vector re;
				if(solve(vp[i][0].first,i))  //i是子节点,vp[i][0].first是父节点 
				{
					re.push_back(vp[i][0].second);
				 } 
				 if(solve(vp[i][1].first,i))
				 {
				 	re.push_back(vp[i][1].second);
				  } 
				  
				  for(j=0;j


你可能感兴趣的:(hihocoder中的巧妙思维)