树的同构--poj 1635(有根树)ustc 1117 (无根树)

本文探讨了树的同构问题,重点在于如何判断两棵树是否同构。通过将每个点的权值定义为其子树的权值之和,利用哈希表来检查根节点的权值是否相等,从而确定树的同构性。虽然存在一定的随机性和不确定性,但这种方法在大多数情况下能有效解决问题。此外,还提及了一种更复杂的解决方案,即使用‘最小表示’来表示节点的子树序列,但由于实现复杂,可能并不一定更快。
摘要由CSDN通过智能技术生成

只有一个点入度为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(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值