只有一个点入度为0的树是外向树,只有一个点出度为0的树是内向树,这两种是典型的有根树
平时见到的无向图中的树是无根树
1.判断树同构本质是哈希,每个点的权值是这个点的子树的权值和,这里所谓的权值是随机数产生的
由于随机性,树上某一组合不同都会导致最终的结果不一样,所以只要判断根的权值是否相等就可以确定同构
2.随机性决定了不确定性,但正确率还是很高
3.可以不用哈希,用“最小表示”表示出一个点的子节点,再比较最小表示产生的序列是否相同,代码烦,比较复杂,不见得快
poj 1635
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define mod 9997
char str1[10000];
char str2[10000];
int h[10000],len,cur;
char *p;
int hashing(int j)
{
int sum=h[j];
while(*p!='\0'&&*p++=='0') //每次检查是否1时还加1,使回溯时跳出循环
{
sum=(sum+hashing(j+1)*h[j])%mod;
}
return (sum*sum)%mod;
}
int main ()
{
for(int i=0;i<10000;++i)
h[i]=rand()%mod;
int test;scanf(