关闭

【bzoj 4337】树的同构

334人阅读 评论(0) 收藏 举报
分类:

传送门~

解题思路

树同构模板题。
为了保险用了双哈希。
选了极其暴力的方法处理两个重心的情况:对于每个重心分别求哈希值然后取max。
哈希的时候,每次将所有子节点的哈希值排好序拿出来,然后看心情瞎搞,随便乘一乘模一模,最后将根节点的哈希值作为整棵树的哈希值。
代码:

#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<cstdlib>
using namespace std;
struct tree{
    int hed[55],nex[105],lb[105];
    int w1[55][55],w2[55][55];
    int h1[55],h2[55],ha1,ha2;
    int u[5],n,root,tot,lo;
    void add(int x,int y){
        lo++;
        nex[lo]=hed[x];
        hed[x]=lo;
        lb[lo]=y;
    }
    void read(){
        int x;
        memset(hed,0,sizeof(hed));
        ha1=ha2=tot=lo=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&x);
            if(!x) root=i;
            else {add(x,i);add(i,x);}
        }
    }
    int getu(int x,int fa){
        int siz=1,flag=0;
        for(int i=hed[x];i!=0;i=nex[i])
        if(lb[i]!=fa){
            int r0=getu(lb[i],x);
            if(r0*2>n) flag=1;
            siz+=r0;
        }
        if((n-siz)*2>n) flag=1;
        if(!flag) u[++tot]=x;
        return siz;
    }
    void ha(int x,int fa){
        h1[x]=17;h2[x]=59;
        int len=0;
        for(int i=hed[x];i!=0;i=nex[i])
        if(lb[i]!=fa){
            ha(lb[i],x);len++;
            w1[x][len]=h1[lb[i]];
            w2[x][len]=h2[lb[i]];
        }
        if(!len) return ;
        sort(w1[x]+1,w1[x]+len+1);
        sort(w2[x]+1,w2[x]+len+1);
        for(int i=1;i<=len;i++) h1[x]=(h1[x]*19260%817+w1[x][i]*17%233)%1777;
        for(int i=1;i<=len;i++) h2[x]=(h2[x]*83374%294+w2[x][i]*40%332)%1443;
    }
    void solve(){
        read();
        int r=getu(root,root);
        for(int i=1;i<=tot;i++){
            ha(u[i],u[i]);
            ha1=max(ha1,h1[u[i]]);
            ha2=max(ha2,h2[u[i]]);
        }
    }
    bool operator == (const tree p) const{
         return (ha1==p.ha1 && ha2==p.ha2);
    }
}T[55]; 
int m;
int main(){
    scanf("%d",&m);
    for(int i=1;i<=m;i++) T[i].solve();
    for(int i=1;i<=m;i++)
    for(int j=1;j<=m;j++)
    if(T[i]==T[j]) {printf("%d\n",j);break;}
    return 0;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

BZOJ 3551 ONTAK2010 Peaks加强版 Kruskal重构树+可持久化线段树

题目大意:同3545 强制在线 3545题解传送门:http://blog.csdn.net/popoqqq/article/details/40660953 强制在线没法排序 启发式合并也就用不了了...
  • PoPoQQQ
  • PoPoQQQ
  • 2014-11-21 14:40
  • 2839

【BZOJ4540】【Hnoi2016】序列 线段树

Claris劲啊!CA劲啊! %%%两位线段树做法传送门在这里和这里 逆向题解时间到: 首先将询问按照终点排序,并且一边从到遍历,不妨设当前遍历到了点,对于之前的每个点,我们维护两个值和。 其中...
  • qq_34637390
  • qq_34637390
  • 2016-05-04 11:35
  • 1784

【BZOJ2759】一道动态树的好题

2759: 一个动态树好题Time Limit: 10 Sec Memory Limit: 128 MB Description有N个未知数x[1..n]和N个等式组成的同余方程组: x[i]=...
  • qq_30401759
  • qq_30401759
  • 2016-02-10 12:06
  • 1145

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

Description 树是一种很常见的数据结构。 我们把N个点,N-1条边的连通无向图称为树。 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树。 对于两个树T...
  • sunshinezff
  • sunshinezff
  • 2016-07-08 11:14
  • 967

BZOJ 4337: BJOI2015 树的同构|Hash

此题三战三卒……!! 一卒:没有考虑连边的顺序。 二卒:用排序解决了连边的顺序,然后用重心似乎搞不了…… 三卒:考虑到rp问题,换了换hash的数..三卒! 扔了重心终于A掉了 可以用括...
  • ws_yzy
  • ws_yzy
  • 2016-02-13 17:21
  • 650

【BJOI2015】【BZOJ4337】树的同构

Description树是一种很常见的数据结构。 我们把N个点,N-1条边的连通无向图称为树。 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树。 对于两个树T1和T2...
  • CreationAugust
  • CreationAugust
  • 2016-01-22 20:33
  • 882

bzoj 4337 树的同构(树Hash)

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4337 代码: #include using namespace std; ...
  • sinat_32872703
  • sinat_32872703
  • 2017-07-08 20:10
  • 98

bzoj 4337: BJOI2015 树的同构 (树hash)

题目描述传送门题目大意:对于两个树T1和T2,如果能够把树T1的所有点重新标号,使得树T1和树T2完全相 同,那么这两个树是同构的。给你M个有根树,请你把它们按同构关系分成若干个等价类。题解感觉树h...
  • clover_hxy
  • clover_hxy
  • 2017-06-01 18:56
  • 204

BZOJ 4337 BJOI2015 树的同构 Hash

题目给定mm棵无根树,求每棵树与其同构的树的最小编号。 1≤N,M≤501\leq N,M\leq 50分析考虑hashhash,要求不涉及编号对答案的影响,且为了确保正确用2个Hash。 我使用...
  • y20070316
  • y20070316
  • 2016-02-06 21:27
  • 400

【Hash】bzoj4337 BJOI2015树的同构

树的哈希
  • Flanoc
  • Flanoc
  • 2017-07-09 13:15
  • 180
    个人资料
    • 访问:4208次
    • 积分:596
    • 等级:
    • 排名:千里之外
    • 原创:51篇
    • 转载:0篇
    • 译文:0篇
    • 评论:15条
    最新评论