【BZOJ4337】BJOI2015 树的同构 括号序列

【BZOJ4337】BJOI2015 树的同构

Description

树是一种很常见的数据结构。
我们把N个点,N-1条边的连通无向图称为树。
若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树。
对于两个树T1和T2,如果能够把树T1的所有点重新标号,使得树T1和树T2完全相同,那么这两个树是同构的。也就是说,它们具有相同的形态。
现在,给你M个有根树,请你把它们按同构关系分成若干个等价类。

Input

第一行,一个整数M。
接下来M行,每行包含若干个整数,表示一个树。第一个整数N表示点数。接下来N个整数,依次表示编号为1到N的每个点的父亲结点的编号。根节点父亲结点编号为0。

Output

输出M行,每行一个整数,表示与每个树同构的树的最小编号。

Sample Input

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

Sample Output

1
1
3
1

HINT

【样例解释】
编号为1, 2, 4 的树是同构的。编号为3 的树只与它自身同构。 
100% 的数据中,1 ≤ N, M ≤ 50。 

题解:题意有问题,题中的树同构是无根树的同构。。。

一开始写了个hash,被卡了,于是学了一发高端的做法。

如果是一棵有根树,那么我们从根开始DFS整棵树,将每个节点的入栈和出栈看成左括号和右括号,最终得到一个括号序列即能代表整棵树。

那么无根树呢?以重心为根即可。如果有两个重心呢?各跑一遍,然后取字典序较小的那个即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int n,mn,m,cnt;
int bel[55],siz[55],to[110],next[110],head[55],mx[55];
string f[55],p[55],g[55];
inline int rd()
{
	int ret=0,f=1;	char gc=getchar();
	while(gc<'0'||gc>'9')	{if(gc=='-')	f=-f;	gc=getchar();}
	while(gc>='0'&&gc<='9')	ret=ret*10+(gc^'0'),gc=getchar();
	return ret*f;
}
inline void add(int a,int b)
{
	to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x,int fa)
{
	int i,sum=0;
	for(i=head[x];i!=-1;i=next[i])	if(to[i]!=fa)	dfs(to[i],x);
	for(i=head[x];i!=-1;i=next[i])	if(to[i]!=fa)	p[++sum]=f[to[i]];
	f[x]="(";
	sort(p+1,p+sum+1);
	for(i=1;i<=sum;i++)	f[x]+=p[i];
	f[x]+=")";
}
void getrt(int x,int fa)
{
	mx[x]=0,siz[x]=1;
	for(int i=head[x];i!=-1;i=next[i])	if(to[i]!=fa)	getrt(to[i],x),siz[x]+=siz[to[i]],mx[x]=max(mx[x],siz[to[i]]);
	mx[x]=max(mx[x],m-siz[x]);
	mn=min(mn,mx[x]);
}
string get()
{
	string tmp="";
	m=rd();
	int i,a;
	memset(head,-1,sizeof(head)),cnt=0;
	for(i=1;i<=m;i++)
	{
		a=rd();
		if(a)	add(a,i),add(i,a);
	}
	mn=1<<30,getrt(1,0);
	for(i=1;i<=m;i++)	if(mx[i]==mn)
	{
		dfs(i,0);
		tmp=max(tmp,f[i]);
	}
	return tmp;
}
int main()
{
	n=rd();
	int i,j;
	for(i=1;i<=n;i++)	g[i]=get();
	for(i=1;i<=n;i++)
	{
		for(j=1;j<i;j++)	if(g[i]==g[j])	break;
		printf("%d\n",j);
	}
	return 0;
}//4 4 0 1 1 2 4 2 0 2 3 4 0 1 1 1 4 0 1 2 3 
posted @ 2017-11-23 20:55  CQzhangyu  阅读(598)  评论(0编辑  收藏  举报