CSU 2229 树 思维

http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2229

Description

xrdog有一棵n个节点的完全二叉树

(若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树)

然而不幸的是调皮的小波把这棵树的每个节点的编号给擦去了,她就是不愿意告诉xrdog这棵树到底长什么样子.....

然而,xrdog记得有n(n-1)(n-2)条关于这颗树的信息,每条信息均不完全一样。

每个信息由一个四元组组成(i,j,k,0/1)(i≠j≠k)

若四元组最后一个元素为0,表示编号为k的这个节点不是节点i和节点j的LCA

若四元组最后一个元素为1,表示编号为k的这个节点是节点i和节点j的LCA

(最近公共祖先简称LCA(Lowest Common Ancestor),是当给定一个有根树T时,对于任意两个结点u、v,找到一个离根最远的结点x,使得x同时是u和v的祖先,x便是u、v的最近公共祖先。)

现在,xrdog想知道树根节点的编号是多少,你能帮助一下可怜的他嘛....

Input

一行一个整数n (3 ≤ n ≤ 8)

接下来n(n-1)(n-2)行,每行四个整数表示四元组(i,j,k,0/1)(i≠j≠k)

Output

一行一个整数,表示树根节点的编号

Sample Input

3
1 3 2 0
3 1 2 0
3 2 1 0
2 3 1 0
1 2 3 1
2 1 3 1

Sample Output

3

思路:n(n-1)(n-2)其实已经给出了这棵树的所有关系了,又是完全二叉树,因此以根结点作为LCA的情况肯定是最多的。(从左右子树任选一个都满足题意)

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;

int cnt[15];
int n,a,b,c,d;

int main()
{
	scanf("%d",&n);
	int temp=n;
	n*=(n-1)*(n-2);
	for(int i=0;i<n;i++)
	{
		scanf("%d %d %d %d",&a,&b,&c,&d);
		if(d==1)
			cnt[c]++;
	}
	int id=0;
	for(int i=1;i<=temp;i++)
		if(cnt[i]>cnt[id])
			id=i;
	printf("%d\n",id);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xiji333/article/details/89761548