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;
}