[51nod1676]无向图同构
如果一个无向图重标号后与另一个无向图完全一致(即对于任意两点,他们之间的边在两个图中都存在或都不存在),则称两个无向图同构。
给定两个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]无向图同构的更多相关文章
- 2018牛客网暑期ACM多校训练营(第一场) D - Two Graphs - [无向图同构]
题目链接:https://www.nowcoder.com/acm/contest/139/D 题目描述 Two undirected simple graphs and where are i ...
- BZOJ 4337: BJOI2015 树的同构 树hash
4337: BJOI2015 树的同构 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4337 Description 树是一种很常见的数 ...
- bzoj4337树的同构
树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如果能够把树T1的所有点重 ...
- bzoj3871: [Neerc2013 C]Cactus Automorphisms || 3899: 仙人掌树的同构
Description 给定一个N,N<=50 000个节点的仙人掌,其是指每条边最多在一个环中的无向图,求仙人掌有多少种自同构.自同构是指得是图的顶点集合V到V的变换M, 以P1^a1*P2^ ...
- 【BZOJ4337】BJOI2015 树的同构 括号序列
[BZOJ4337]BJOI2015 树的同构 Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱 ...
- BZOJ4337:[BJOI2015]树的同构(树hash)
Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如 ...
- BZOJ4337:[BJOI2015]树的同构——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4337 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根, ...
- [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
4337: BJOI2015 树的同构 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1023 Solved: 436[Submit][Status ...
- 刷题总结——树的同构(bzoj4337 树上hash)
Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如 ...
随机推荐
- 【二十四】使用mysqli扩展类批量执行多条sql语句
批量处理多个sql语句 <?php //批量执行多个dml语句 // $mysqli=new mysqli("localhost","root",&quo ...
- 通过 Sublime Package Control 安装插件后不能用的解决办法
最近使用 Sublime 写 SASS 的时候需要使用高亮功能,通过 Package Control 安装了相关插件,但是安装之后没有反应,再次打开 Package Control 的时候,已经搜索不 ...
- js的Date对象
1.构造Date对象 var dt = new Date(); //获取当地包含日期和时间的对象,格式为:Thu Aug 31 2017 09:15:43 GMT+0800 (中国标准时间) 2.使用 ...
- tp3.2 事务处理
事务的机制通常被概括为“ACID”原则即原子性(A).稳定性(C).隔离性(I)和持久性(D). 原子性:构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行. 稳定性:数据库在事 ...
- date 命令详解
date - print or set the system date and time Display the current time in the given FORMAT, or set th ...
- 为什么硬链接不能链接目录、文件inode 和目录 dentry 的区别联系
我们对任何一个目录用ls -l 命令都可以看到其连接数至少是2,这也说明了系统中是存在硬连接的,而且命令ln -d 也可以让超级用户对目录作硬连接,这些都说明了系统限制对目录进行硬连接只是一个硬性规定 ...
- golang社区
a development list for Go Programming Language https://groups.google.com/forum/#!forum/golang-dev a ...
- CentOS 7.x上gitlab搭建教程(https可用,邮件可用)
目录 知识要求 搭建感想 搭建过程 参考 知识要求: nginx基础知识 搭建感想 注:以下是我搭建gitlab时的思考,需要nginx的基础知识,Docker的基础知识才容易理解,与下面的搭建过程是 ...
- centos7 系统安装问题汇总
centos7 系统安装问题汇总: 1.使用u盘 安装centos7时,一直提示:'.../dev/root does not exist,could not boot' 解决方法: 2.不能将原来 ...
- UWP 手绘视频创作工具技术分享系列 - 文字的解析和绘制
本篇作为技术分享系列的第二篇,详细讲一下文字的解析和绘制,这部分功能的研究和最终实现由团队共同完成,目前还在寻找更理想的实现方式. 首先看一下文字绘制在手绘视频中的应用场景 文字是手绘视频中很重要的表 ...