如果一个无向图重标号后与另一个无向图完全一致(即对于任意两点,他们之间的边在两个图中都存在或都不存在),则称两个无向图同构。
  给定两个n个点m条边的无向图,判定两个无向图是否同构。不超过20组数据,n<=200,m<=4000

题解:初始时设每个点为点权为1,之后进行n次迭代,每次迭代每个点的值更替为与其相邻的点和他本身上一次迭代后的权值排序后计算出的hash值。

  只要hash值相等就好了。。权值排序那部分不用在算每个点的时候都重新排序。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 #define ll long long
 7 #define ui unsigned int
 8 #define ull unsigned long long
 9 const int maxn=233,inf=1002333333;
10 struct zs1{int too,pre;}e1[23333],e2[23333];int tot1,last1[maxn],tot2,last2[maxn];
11 struct zs{int id;ull v;}a1[2][maxn],a2[2][maxn];
12 int p1[maxn],p2[maxn];
13 int i,j,k,n,m;
14
15 int ra,fh;char rx;
16 inline int read(){
17     rx=getchar(),ra=0,fh=1;
18     while((rx<'0'||rx>'9')&&rx!='-')rx=getchar();
19     if(rx=='-')fh=-1,rx=getchar();
20     while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;
21 }
22
23 inline void ins1(int a,int b){
24     e1[++tot1].too=b,e1[tot1].pre=last1[a],last1[a]=tot1;
25     e1[++tot1].too=a,e1[tot1].pre=last1[b],last1[b]=tot1;
26 }
27 inline void ins2(int a,int b){
28     e2[++tot2].too=b,e2[tot2].pre=last2[a],last2[a]=tot2;
29     e2[++tot2].too=a,e2[tot2].pre=last2[b],last2[b]=tot2;
30 }
31
32 bool operator <(zs a,zs b){return a.v<b.v;}
33 int main(){
34     register int i,j;ull k;
35     for(int T=read();T;T--){
36         tot1=tot2=0,memset(last1+1,0,n<<2);memset(last2+1,0,n<<2);
37         n=read(),m=read();
38         for(i=1;i<=m;i++)ins1(read(),read());
39         for(i=1;i<=m;i++)ins2(read(),read());
40         for(i=1;i<=n;i++)a1[0][i]=a2[0][i]=(zs){i,1ull},ins1(i,i),ins2(i,i),a1[1][i].id=a2[1][i].id=p1[i]=p2[i]=i;
41         bool now=1,pre=0;int p;
42         for(p=n;p;p--,now^=1,pre^=1){//printf("now,pre:%d %d\n",now,pre);
43             for(i=1;i<=n;i++)a1[now][i].v=a2[now][i].v=0;//,printf("    %llu %llu\n",a1[pre][i].v,a2[pre][i].v);
44             for(i=1;i<=n;i++)p1[a1[now][i].id]=p2[a2[now][i].id]=i;
45             for(i=1;i<=n;i++){
46                 for(j=last1[a1[pre][i].id],k=a1[pre][i].v/*,printf("   %llu\n",k)*/;j;j=e1[j].pre)
47                     (a1[now][p1[e1[j].too]].v*=2333ull)+=k;
48                 for(j=last2[a2[pre][i].id],k=a2[pre][i].v;j;j=e2[j].pre)
49                     (a2[now][p2[e2[j].too]].v*=2333ull)+=k;
50             }
51             std::sort(a1[now]+1,a1[now]+1+n),
52             std::sort(a2[now]+1,a2[now]+1+n);
53             for(i=1;i<=n&&a1[now][i].v==a2[now][i].v;i++);//printf("        %llu %llu\n",a1[now][i].v,a2[now][i].v);
54             if(i<=n)break;
55         }puts(!p?"YES":"NO");
56     }
57 }

View Code

转载于:https://www.cnblogs.com/czllgzmzl/p/5950970.html

[51nod1676]无向图同构相关推荐

  1. 51nod 1676 无向图同构 hash

    题意 如果一个无向图重标号后与另一个无向图完全一致(即对于任意两点,他们之间的边在两个图中都存在或都不存在),则称两个无向图同构. 给定两个n个点m条边的无向图,判定两个无向图是否同构. n<= ...

  2. 无向图同构 (哈希)

    题目 Problem Description 如果一个无向图重标号后与另一个无向图完全一致(即对于任意两点,他们之间的边在两个图中都存在或都不存在),则称两个无向图同构. 给定两个n个点m条边的无向图 ...

  3. 基于矩阵合同变换算法的无向图同构识别——C++代码实现

    兹于2017年4月,应<算法设计与分析>课程设计的要求,本人就基于矩阵合同变换算法的图同构识别做了较为深入的理解,借助<西南民族大学学报(自然科学版)>2011年第05期,作者 ...

  4. 非标定的n阶无向图的非同构个数

    非标定的n阶无向图的非同构个数 特别鸣谢wp师兄跟我的讲解 问题分析: 1. 先不考虑同构,只管标定图的数量 首先我们先从标定图开始看,总共有多少个n阶标定图? 其实这就相当于固定了点数,数边的数量. ...

  5. [BJOI2015] 树的同构

    4337: BJOI2015 树的同构 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1092  Solved: 460 [Submit][Stat ...

  6. 3维线程格 gpu_论文导读 | GPU加速子图同构算法

    GPU加速子图同构算法 作者: 曾立 邹磊 M. Tamer Özsu 胡琳 张藩 论文链接:https://arxiv.org/abs/1906.03420 本次论文讲解的是曾立.邹磊.M. Tam ...

  7. 子图同构算法——Ullmann算法(1)不包含refine procedure的简单穷举算法。

    摘要: 转载请注明来自stanlysheng--talk is cheap, show me your code.http://www.cnblogs.com/stanly/ .谢谢.此文我也在CSD ...

  8. 无向图g的邻接矩阵一定是_矩阵是图

    无向图g的邻接矩阵一定是 To study structure,tear away all flesh soonly the bone shows. 要研究结构,请尽快撕掉骨头上所有的肉. Linea ...

  9. 【BZOJ - 4337】BJOI2015 树的同构(树哈希)

    题干: 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如果能够把树T1的 ...

最新文章

  1. 写给自己的2019年规划
  2. Excel中VLOOKUP函数的用法和注意点
  3. 合并文件夹中子目录_如何整理文件夹,看这一篇就够了,简单易学
  4. 医疗影像技术简介(X射线,CT,MRI等)
  5. linux下获取微秒级精度的时间【转】
  6. 地址栏 输入 参数 刷新参数丢失_Java 编程技巧:如何实现参数的输入输出?
  7. C# MP3操作类,能播放指定的mp3文件,或播放嵌入的资源中的Mp3文件
  8. Java笔记(韩顺平Java基础1-2章)
  9. c语言程序设计100题,编程题(c语言编程题库100题)
  10. 3串锂电池充电保护板设计
  11. ECShop 批量打印快递单
  12. 网赚 CashFiesta 简介及操作攻略
  13. JZ2440 ping不通电脑的一种可能原因 PING 192.168.88.226 (192.168.88.226): 56 data bytes
  14. 【水题】CodeForce 1183B Equalize Prices
  15. Kotlin入门-带着问题,理解 对象表达式和对象声明
  16. php用excel打不开,应用phpexcel导出excel文件后打不开的问题解决方法
  17. 代码量怎么计算_怎么样利用南方CASS三角网法和方格网法进行土方量计算
  18. Android Room 数据库使用记录
  19. MM们必败潮物。。。。大眼睛的小秘密哦```````
  20. excel 域 邮件合并_如何获得免费的电子邮件域(5种快速简便的方法)

热门文章

  1. PHP源码加密方法实例
  2. java 仿qq庅_[源码和文档分享]基于java 的仿QQ聊天工具
  3. Linux下从NCBI批量下载SRA数据的sra和aspera方法
  4. 前端面试题之CSS篇
  5. python怎样定义数组_python中定义数组的正确方法
  6. oracle数据库报错12154,PL/SQL登录Oracle数据库报错ORA-12154:TNS:无法解析指定的连接标识符解决方法...
  7. 02在windows配置适合树莓派开发的环境
  8. COS SOE的差异
  9. 最近常常梦见家乡,梦见儿时的同伴了.....
  10. 在linux解压文件夹,在linux 下解压 rar 文件