有根树同构 (Hash)

Apple CarPlay Certification Guide December 2022 解析V1.0 Apple CarPlay Certification Guide December 2022更新说明 阅读详情

crf 出生的第二秒

1 Description
crf 是一个天才。
他出生的第二秒,往窗外望了一眼,看到了窗外的树林。
他发现这片树林非常有趣,因为它只有一排树,从左到右依次排列。
天才的crf 马上就把真实的树的结构抽象成为了图论中的树(即任意两个顶点有且仅有一条路径可以互相到达的图)。
crf 不仅头脑天才,而且他的身体素质也堪称天才,这也包括了他可以在0.01 秒内用AWP 爆掉队友的头的动态视力。在这一秒内他发现非常多的树其实稍微变一下方向就是长得一样的。
他想知道,在这片树林中有多少棵树和他现在脑中yy 的这棵树是本质相同的。
两棵树本质相同的定义是,对于树A,存在一种顶点编号的排列,使得树A 的顶点编号重排后,树A 的每一条边的方向和两个顶点都和树B 对应相同。
注意,虽然图论中大多数对树的定义都是指无根树,即每条树边都是无向边的树,但在这个问题中的树是现实中的树的抽象,所以我们认为这些树都是有根树。
同时为了方便起见,我们假设每棵树具有相同的结点数。

2 Input
第一行为三个整数n; m; q,表示这排树林树的数量、每棵树的结点数和询问的数量。
接下来n 部分,每部分有m��1 行,表示一棵树的m��1 条边,每行有两个整数x; y,表示从x 到y 有一条边。
接下来q 部分,每部分有m-1 行,表示询问中的一棵树的m-1 条边,每行有两个整数x, y,表示从x 到y 有一条边。

3 Output
输出有q 行,每行一个整数,表示该次询问有多少棵树和crf 想象的那棵树本质相同。

4 Sample
Sample Input
1 5 1
1 2
2 3
1 4
4 5
1 3
3 2
1 5
5 4
Sample Output
1

5 Hint
对于30% 的数据,满足1 <= n, q <= 10; 1 <= m <= 5。
对于100% 的数据,满足1 <= n m <= 100000; 1 <= q m <= 100000。

思路:
这道题其实是有向图,题目说的不够清楚,所以wa掉。。
判结构相同的树,又强制O1,自然想到hash啦。
考试的时候就写了一个简洁的hash,没想到下来有人说正解不是hash,开始疯狂的hack。
于是只好被逼写了一个双hash,又不停地限制,然后就这样了。。。
也不知道有没有问题,反正应该不容易被卡吧。

#include <map>
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
#define LL long long
#define N 100010
#define base1 7173
#define base2 7177
#define mod1 1000000007
#define mod2 1000000009
#define pr pair<LL, LL>
using namespace std;

struct Edge{
    int to, nxt;
}ed[N<<1];

int n, m, q, idc, rt, mxd;
int head[N], in[N], siz[N];
LL hsh1[N], hsh2[N], rnd1[N], rnd2[N];
map<pr, int> mp[N];

void inline adde(int u, int v){
    ed[++idc].to = v;
    ed[idc].nxt = head[u];
    head[u] = idc; 
    in[v]++;
}

void inline dfs(int u, int dep){
    LL cc1=base2, cc2=base1, cnt=0;
    siz[u] = 1, mxd = max(mxd, dep); 
    for(register int i=head[u]; i; i=ed[i].nxt){
        int v = ed[i].to; dfs(v, dep+1);
        (hsh1[u] += hsh1[v]) %= mod1; (hsh2[u] += hsh2[v]) %= mod2;
        (cc1 += rnd1[siz[v]]) %= mod1; (cc2 += rnd2[siz[v]]) %= mod2;
        siz[u] += siz[v]; cnt++; 
    }//hash:深度, 树的大小, 子树大小, 子树个数 
    (hsh1[u] += rnd1[siz[u]]) %= mod1; (hsh2[u] += rnd2[siz[u]]) %= mod2;
    (hsh1[u] += cc1) %= mod1; (hsh2[u] += cc2) %= mod2;
    (hsh1[u] *= cnt) %= mod1; (hsh2[u] *= cnt) %= mod2;
}

pr inline solve(){
    idc = mxd = 0;
    for(register int i=1; i<=m; i++) head[i] = in[i] = hsh1[i] = hsh2[i] = 0;
    for(register int i=1,; i<m; i++){
        int u, v; scanf("%d%d", &u, &v); adde(u, v);
    }
    for(register int i=1; i<=m; i++) 
        if( !in[i] ){ rt = i; break;}//给出的是合法的树,所以有唯一一个root 
    dfs(rt, 1);
    return make_pair(hsh1[rt], hsh2[rt]);
}

int main(){
    freopen ("second.in", "r", stdin);
    freopen ("second.out", "w", stdout);
    scanf("%d%d%d", &n, &m, &q);
    rnd1[0] = rnd2[0] = 1;
    for(register int i=1; i<=m; i++){
        rnd1[i] = rnd1[i-1] * base1 % mod1;
        rnd2[i] = rnd2[i-1] * base2 % mod2;
    }
    for(register int i=1; i<=n; i++){
        pr rnd = solve();
        mp[mxd][rnd]++;
    }
    for(register int i=1; i<=q; i++){
        pr rnd = solve();
        printf("%d\n", mp[mxd][rnd]);
    }
    return 0;
}
R3LIVE项目实战(3) —双目相机与激光雷达 lidar_camera_calib联合标定 lidar_camera_calib是一个在无目标环境中,用于高分辨率LiDAR(例如Livox)和摄像机之间准确的外部标定工具。我们的算法可以在室内和室外场景中运行,并且只需要场景中的边缘信息。如果场景适合,我们可以实现类似于或甚至超过基于目标的方法的像素级准确度。我们使用标定的外部参数给点云上色,并与实际图像进行比较。A和C是点云的局部放大视图。B和D是与A和C中的点云对应的摄像机图像的部分。 阅读详情

相关推荐

训练AI:从数据收集到模型部署的完整指南

如果你刚开始接触AI,建议先学习一些基础的编程和机器学习知识,还可以使用现成的AI平台和工具来帮助你训练AI模型。在这篇文章中,我们将详细探讨从数据收集到模型部署的完整步骤,并提供一些有用的技巧和工具,以帮助你成功地训练自己的AI模型。在收集数据时,你需要从可靠的数据源(如数据仓库、数据集市、API接口)获取数据,确保数据的准确性和完整性。常用的划分比例是70%的数据集用于训练模型、15%的数据集用于验证模型,5%的数据集用于超参数调整,最后10%的数据集用于测试模型的性能。测试数据集用于测试模型的性能。

a_wsnd的博客 4166

有根树的同构

有根数的同构 题目大意 主要是判断给你的k棵有根树,问哪几个树是同构的 发一下原题吧: 图的同构是指两个图“相同”,这有着广泛的应用。比如当我们要对一批图施行某种操作的时候,如果我们能发现其中一些图是同构的,我们就可以在这些同构的图中只保留一个,从而降低工作量。比如,上图中的T1和T3就是同构的。 下面我们给出图的同构的定义。给出两个图G1=(V1,E1),G2=(V2,E2)。如果存在一个V1到...

jay_zai的博客 721

国家大地2000坐标系投影坐标转高德地图经纬度坐标-【高斯投影坐标】

国家大地2000坐标系投影坐标转换成高德经纬度坐标显示画图。

devil_zhuzhu的博客 1万+

Vijos1683 有根树的同构问题

题目链接 题目讲了这么多,其实就是让我们从k个树中找到“一样”的树 上图两棵树就是同构的 也就是说,两棵树通过交换树链位置可以变成完全相同的树,这两棵树就是同构的 于是算法就出来了,我们可以把每棵树按一定规则交换树链位置,判断是否完全相同 *怎么做呢? 1、首先用括号表示法表示每棵树,()代表一个节点 例如: 1-&gt;2 1-&gt;3 表示为 (()()) 2、对于每...

星梦的博客 840

Orbbec-Gemini-335 深度相机 Python SDK 编译与配置全记录(Windows 环境)

本篇博客将围绕 Windows 系统下 Orbbec SDK 的 Python 配置与编译过程进行详细说明,主要使用的是官方提供的 pyorbbecsdk Python wrapper 项目以及 Orbbec SDK V2 Python Wrapper 配置指南,并记录了安装与配置过程中遇到的若干问题及解决办法。

Junseer的博客 1965

蓝桥杯算法:打印图形——六芒星

【输入格式】 输入一行包含一个整数 n。 【输出格式】 输出一个六芒星,表示满足题意的图形。 【样例输入】 3 4 【样例输出】 【评测用例规模与约定】 对于所有评测用例,1 ≤ n ≤ 20。 总结: 第一次做图形题,做了蛮久,图形题有很多的方式去完成,它考验的是你能不能找到更简单的那一种方式. 我初看到这个图形,第一种想法是把这个六芒星当做六个小三角形来做,然后以某种规则排列一下,就能做出来,但是尝试了一下感觉太麻烦了。 然后我的第二种想法是,这个图形是对称图形,怎么能写出一半吗? 这样另一半想办

KeepCodeing 3836

Jzoj1155 有根树的同构(树的Rabin-Karp)

这里简单说一下rabin-karp 其实就是字符串hash算法,不理解的可以自行百度 对于一颗树,我们可以将其变为一个括号序列,对这个括号序列作rabin-karp,让后就可以轻松判断同构了是不是很简单 细节不多说,有一点必须注意:因为子树是无序的,所以dfs时必须对子树排序 #include #include #include #include using namespace std;

扩展の灰(Extended Ash/Cooevjnz) 693

Python 爬虫实战:爬取 B 站 UP 主投稿数据,分析更新频率与粉丝互动

摘要:本文基于Python技术实现B站UP主投稿数据的自动化爬取与分析。通过解析B站WBI签名机制和API接口,获取UP主视频的标题、播放量、点赞数等核心数据。采用时间序列分析统计更新频率,结合相关性分析挖掘内容特征与粉丝互动的关联。结果显示编程类视频播放量最高,10-20分钟时长的视频表现最佳,投币数与播放量相关性达0.92。文章详细介绍了接口分析、反爬应对等关键技术,为内容创作者优化策略提供数据支持,同时强调遵守平台规范的爬取原则。

2503_91057718的博客 1537

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

只有一个点入度为0的树是外向树,只有一个点出度为0的树是内向树,这两种是典型的有根树 平时见到的无向图中的树是无根树 1.判断树同构本质是哈希,每个点的权值是这个点的子树的权值和,这里所谓的权值是随机数产生的 由于随机性,树上某一组合不同都会导致最终的结果不一样,所以只要判断根的权值是否相等就可以确定同构 2.随机性决定了不确定性,但正确率还是很高 3.可以不用哈希,用“最小表示”表示出

Jackyguo1992的专栏 4135

(代码可运行)半导体器件和工艺模拟 使用Silvaco设计构建NMOS并提取各项工艺及器件参数

win10。

qq_20388971的博客 110

android 14.0 去掉usb授权提示框 默认给予权限

在14.0的系统rom产品开发中,在进行iot关于插入usb设备的开发过程中,在插入usb设备时会弹出usb授权提示框,也带来一些不便, 这个需要默认授予USB权限,插拔usb都不弹出usb弹窗所以这要从usb授权相关管理页默认给与usb权限,接下来分析下 相关的实现功能流程

安卓兼职framework和app工程师的博客 2263

【有根树的同构】ZOJ 1990/POJ 1635

有根树的同构的意思就是两棵树的形状一样,子树可以旋转,因此,当子树的子节点数相同就可以判断同构 不用建树,只需要利用dfs时遇到'1'的时候回溯就行,开一个数组hash[i] = j表示子结点数为i(包括自己)的结点为j个 0ms无压力 int hash[801];//hash[i] = j表示子结点数为i(包括自己)的结点为j个 int get1(){ int n = 1;

leolin_的专栏 978

机器人中的数值优化(二十一)—— 伴随灵敏度分析、线性方程组求解器的分类和特点、优化软件

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

慕羽★的博客 4206

【哈希】判断有根树同构

这是一个未被验证过正确性的判断有根树同构的哈希函数。可以记忆化搜索或者dfs求得。 f(u)表示以u为根的子树的哈希值。 size(u)表示以u为根的子树的大小。 son(u)表示u的儿子数量。 chi表示u的第i个儿子。 p为种子。 O(n)。 typedef unsigned long long ull; #define N 100001 const ull seed...

weixin_33860722的博客 316

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

poj-1635 Subway tree systems(判断两个有根树是否同构)-哈希法

求两个有根树是否同构,这个如果暴力法枚举的话,复杂度是O(N^2),一中经典的做法是哈希,思想就是使得不同结构的树哈希值不同,而同构的树哈希值相同。 我这个也是参考别人写的,不同的是我先把01串转换为了树状结构表示,然后再递归求哈希值,这样好理解一点。

smartxxyx的专栏 5583

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

哈希算法在判定树同构方面的应用(上)

哈希算法在判定树同构方面的应用(上) (一)需要掌握的前置知识: (1)素数筛法:埃氏筛或者欧拉筛均可以。 以下为欧拉筛: const int maxn=100100; int p[maxn],cnt=0; bool ha[maxn]; void Prime(void) { ha[1]=true; for(int i=2;i<maxn;i++) { if(!ha[i]) p[++cnt]=i; for(int j=1;j<=cnt&

_Griefs 639

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

POJ 1635 Subway tree systems(HASH+判断两棵有根树是否同构)

题意:给出两棵树,判定是否同构(通过旋转使得形状相同)。 思路:HASH+dfs。HASH的方法用的就是杨弋《Hash在信息学竞赛中的一类应用》里的方法,但是一开始hash的p选的不好导致wa了,换了一个素数就ac了......真是看脸....... #include #include #include #include #include #include #include #include

GODSPEED 1447

[POJ1635]Subway tree systems 判断有根树的同构 有根树哈希

诶学习了一下有根树的哈希方法 还不是很懂无根树要怎么哈希#include <iostream> #include <cstdio> #include <stack> #include <map> #include <cstdlib> #include <cstring> #define N 3050 using namespace std; typedef unsigned long long u

HbFS- 592

poj-1635 Subway tree systems(推断两个有根树是否同构)-哈希法

Description Some major cities have subway systems in the form of a tree, i.e. between any pair of stations, there is one and only one way of going by subway. Moreover, most of these citi...

weixin_30687811的博客 104

BZOJ 4337: BJOI2015 树的同构

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

ypxrain的博客 268

USTC 1117

07年的论文,hash的应用。 用hash可以在nlogn的时间内解决有根树的同构判定和无根树的同构判定。 由于没找到靠谱的无根树同构模板题(无根树的同构比较麻烦,写个题确认一下) 于是看到了这道题,第一次知道中科大还有OJ(⊙﹏⊙) 而且貌似不能用TAT 我也不知道Restricted Function是什么鬼,反正就是评测不了,不过把样例过了倒是。 #include#include

月下沙茶树 446

BZOJ4337: BJOI2015 树的同构(hash 树同构)

题意 题目链接 Sol 树的同构问题,直接拿hash判一下,具体流程大概是这样的: 首先转化为有根树,预处理出第\(i\)棵树以\(j\)为根时的hash值。 那么两个树同构当且仅当把两棵树的hash数组排完序后完全一致(感性理解一下) /* */ #include<bits/stdc++.h> #define Pair pair<int, int> #define M...

weixin_30319097的博客 103

无根树同构_hash

先贴上地址https://vjudge.net/problem/HDU-5732 判断有根树同构: 1. 直接用括号最小表示法 2. 利用括号最小表示法的思想进行hash 判断无根树同构: 1. 找到树的重心. 2. 以重心为根, 把无根树转化成有根树. 按照有根树同构的方法判断是否同构. 同构的过程中,为什么可以sort. ...

weixin_30756499的博客 400

gdiplus判断一个点是否在圆弧线上_哈希算法在判定树同构方面的应用(上)

(一)需要掌握的前置知识:(1)素数筛法:埃氏筛或者欧拉筛均可以。以下为欧拉筛:constintmaxn=100100;intp[maxn],cnt=0;boolha[maxn];voidPrime(void){ha[1]=true;for(inti=2;i{if(!ha[i])p[++cnt]=i;for(intj...

weixin_39644021的博客 183

【bzoj4337】【BJOI2015】【树的同构】【hash】

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

sunshinezff的专栏 1705

树的重心与树的同构 寒假集训知识点总结

本文总结了树的重心和树的同构两个重要知识点。树的重心部分介绍了三个等价定义及其证明,阐述了重心的关键性质(数量、移动规律、合并特性等)。树的同构部分详细讲解了有根树和无根树的同构判断方法,包括括号表示法和哈希法,重点分析了无根树通过重心转化为有根树的处理方案,以及换根DP计算所有节点哈希值的实现思路。文中提供了相关算法的代码实现框架,为树结构相关问题提供了系统的解决方案。

这里是小鸽子娅的博客喵~ 969
上一篇: Codeforces 788B Weird journey (欧拉回路 组合数计数)
下一篇: 组合数 (Lucas)
w4149
博客等级 码龄10年 39粉丝 309原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值