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

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

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

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define ui unsigned int
#define ull unsigned long long
const int maxn=,inf=;
struct zs1{int too,pre;}e1[],e2[];int tot1,last1[maxn],tot2,last2[maxn];
struct zs{int id;ull v;}a1[][maxn],a2[][maxn];
int p1[maxn],p2[maxn];
int i,j,k,n,m; int ra,fh;char rx;
inline int read(){
rx=getchar(),ra=,fh=;
while((rx<''||rx>'')&&rx!='-')rx=getchar();
if(rx=='-')fh=-,rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra*fh;
} inline void ins1(int a,int b){
e1[++tot1].too=b,e1[tot1].pre=last1[a],last1[a]=tot1;
e1[++tot1].too=a,e1[tot1].pre=last1[b],last1[b]=tot1;
}
inline void ins2(int a,int b){
e2[++tot2].too=b,e2[tot2].pre=last2[a],last2[a]=tot2;
e2[++tot2].too=a,e2[tot2].pre=last2[b],last2[b]=tot2;
} bool operator <(zs a,zs b){return a.v<b.v;}
int main(){
register int i,j;ull k;
for(int T=read();T;T--){
tot1=tot2=,memset(last1+,,n<<);memset(last2+,,n<<);
n=read(),m=read();
for(i=;i<=m;i++)ins1(read(),read());
for(i=;i<=m;i++)ins2(read(),read());
for(i=;i<=n;i++)a1[][i]=a2[][i]=(zs){i,1ull},ins1(i,i),ins2(i,i),a1[][i].id=a2[][i].id=p1[i]=p2[i]=i;
bool now=,pre=;int p;
for(p=n;p;p--,now^=,pre^=){//printf("now,pre:%d %d\n",now,pre);
for(i=;i<=n;i++)a1[now][i].v=a2[now][i].v=;//,printf(" %llu %llu\n",a1[pre][i].v,a2[pre][i].v);
for(i=;i<=n;i++)p1[a1[now][i].id]=p2[a2[now][i].id]=i;
for(i=;i<=n;i++){
for(j=last1[a1[pre][i].id],k=a1[pre][i].v/*,printf(" %llu\n",k)*/;j;j=e1[j].pre)
(a1[now][p1[e1[j].too]].v*=2333ull)+=k;
for(j=last2[a2[pre][i].id],k=a2[pre][i].v;j;j=e2[j].pre)
(a2[now][p2[e2[j].too]].v*=2333ull)+=k;
}
std::sort(a1[now]+,a1[now]++n),
std::sort(a2[now]+,a2[now]++n);
for(i=;i<=n&&a1[now][i].v==a2[now][i].v;i++);//printf(" %llu %llu\n",a1[now][i].v,a2[now][i].v);
if(i<=n)break;
}puts(!p?"YES":"NO");
}
}

[51nod1676]无向图同构的更多相关文章

  1. 2018牛客网暑期ACM多校训练营(第一场) D - Two Graphs - [无向图同构]

    题目链接:https://www.nowcoder.com/acm/contest/139/D 题目描述 Two undirected simple graphs  and  where  are i ...

  2. BZOJ 4337: BJOI2015 树的同构 树hash

    4337: BJOI2015 树的同构 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4337 Description 树是一种很常见的数 ...

  3. bzoj4337树的同构

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

  4. bzoj3871: [Neerc2013 C]Cactus Automorphisms || 3899: 仙人掌树的同构

    Description 给定一个N,N<=50 000个节点的仙人掌,其是指每条边最多在一个环中的无向图,求仙人掌有多少种自同构.自同构是指得是图的顶点集合V到V的变换M, 以P1^a1*P2^ ...

  5. 【BZOJ4337】BJOI2015 树的同构 括号序列

    [BZOJ4337]BJOI2015 树的同构 Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱 ...

  6. BZOJ4337:[BJOI2015]树的同构(树hash)

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

  7. BZOJ4337:[BJOI2015]树的同构——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4337 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根, ...

  8. [BZOJ4337][BJOI2015]树的同构(树的最小表示法)

    4337: BJOI2015 树的同构 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1023  Solved: 436[Submit][Status ...

  9. 刷题总结——树的同构(bzoj4337 树上hash)

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

随机推荐

  1. HTML基础教程-简介

    关于html5笔记前言 之前有在W3school学习过html5以及javascript.为了和大家一块学习,为了回顾这些遗忘的基础,现在我把之前自己整理的笔记共享给大家.希望大家共同进步. HTML ...

  2. ios 去掉字符串中的空格 和指定的字符

    [问题分析] .使用NSString中的stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]方法只是去掉左右 ...

  3. Java集合(一) CopyOnWriteArrayList

    CopyOnWriteArrayList 类分析   1. CopyOnWriteArrayList 其中底层实现存放数据是一个Object数组:   private volatile transie ...

  4. PHP array_map()

    PHP array_map() 函数 将函数作用到数组中的每个值上,每个值都乘以本身,并返回带有新值的数组: <?php function myfunction($v) { return($v* ...

  5. 搭建redis cluster

    1  下载 redis安装包 tar zxvf redis-3.0.2.tar.gz cd redis-3.0.2/ make make install 2安装ruby sudo apt-get in ...

  6. Java 并发编程:volatile的使用及其原理

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  7. 如何用css写打印样式

    打印样式 打印样式就是针对网页被打印时设置给文档的样式,由于打印时是显示在纸上,跟屏幕还是有区别的,对于有打印需求的网页往往需要设置专门的打印样式来适配页面. @media print 声明自己是打印 ...

  8. JS大小写字母转换

    var a = "ABCd"; console.log(a.toLowerCase());//转换成小写 console.log(a.toUpperCase());//转换成大写

  9. xssgame挑战wp

    前言 昨晚做了一些xss的题目,有点上瘾了,今天想着再找一些来做做. google了一下,发现了不少,找到这么一个. 地址: https://xss-game.appspot.com 这是一个国外的x ...

  10. vb实验7-找出小于18000的最大素数

    vb实验7-找出小于18000的最大素数 vb实验7-找出小于18000的最大素数 ---–写给女朋友的题解 在窗体上画一个文本框,名称为TEXT1,两个命令按钮,C1和 C2,标题分别为" ...