题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3926

题意:给定2个顶点度最大为2的无向图。问你这2个无向图是否同构。

思路:

1.最大度为2.说明这个图可能有多个连通分量,每个连通分量要么是环,要么是链。
2.然后遍历每个连通分量,记录该连通分量的结点个数,以及该连通分量是环还是链。
3.将第一个图按照结点个数排序(若子结点个数相同,则对链先排序)
4.将第二个图按照步骤三排序
5.比较排序后,2个图是否每个元素都相等。若相等,则相似。

关于求链通分量,当然是并查集的一些基本操作了,不过合并的时候应该遵循孩子节点少的合并到孩子节点多的集合中(不然wa),然后就是排序后比较一下就可以了(因为图可能存在环,因此可以先按孩子节点的个数排,然后再按是否存在环排)

#include<time.h>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=+;
int na,ma,nb,mb,t,Ca=,FaA[MAXN],FaB[MAXN];
struct Node{
int cnt; //连通分量的点数
int Type; //1:是环 0:链
Node(int a=,int b=):cnt(a),Type(b){};
}GroupA[MAXN],GroupB[MAXN]; //图1,图2
void Init(){ //初始化
for(int i=;i<MAXN;i++){
FaA[i]=i; FaB[i]=i;
GroupA[i].cnt=; GroupA[i].Type=;
GroupB[i].cnt=; GroupB[i].Type=;
}
}
int Find(int x,int *Fa){ //并查集
return x==Fa[x]?x:Fa[x]=Find(Fa[x],Fa);
}
void Union(int x,int y,int *Fa,Node *Group){//并查集
int rootx=Find(x,Fa);
int rooty=Find(y,Fa);
if(rootx==rooty){ //存在环
Group[rootx].Type=;
}
else{ //把小的合并到大的树上
if(Group[rootx].cnt>=Group[rooty].cnt){
Group[rootx].cnt+=Group[rooty].cnt;
Fa[rooty]=rootx;
}
else{
Group[rooty].cnt+=Group[rootx].cnt;
Fa[rootx]=rooty;
}
}
}
bool cmp(Node a,Node b){ //排序函数,先按点数排,点数相同则优先排链再到环
if(a.cnt!=b.cnt){
return a.cnt<b.cnt;
}
return a.Type<b.Type;
}
bool solve(){ //比较2个图是否同构
sort(GroupA,GroupA+na+,cmp);
sort(GroupB,GroupB+nb+,cmp);
for(int i=;i<=na;i++){
if((GroupA[i].Type!=GroupB[i].Type)||(GroupA[i].cnt!=GroupB[i].cnt)){
return false;
}
}
return true;
}
int main()
{
scanf("%d",&t);
while(t--){
Init();
scanf("%d %d",&na,&ma);
for(int i=;i<=ma;i++){
int u,v;
scanf("%d%d",&u,&v);
Union(u,v,FaA,GroupA);
}
scanf("%d %d",&nb,&mb);
for(int i=;i<=mb;i++){
int u,v;
scanf("%d %d",&u,&v);
Union(u,v,FaB,GroupB);
}
printf("Case #%d: ",Ca++);
if((na!=nb)||(ma!=mb)){ //点数/边数不匹配
printf("NO\n");
continue;
}
if(solve()){
printf("YES\n");
}
else{
printf("NO\n");
}
}
return ;
}

HDU 3926 图的同构的更多相关文章

  1. HDU 3926 并查集 图同构简单判断 STL

    给出两个图,问你是不是同构的... 直接通过并查集建图,暴力用SET判断下子节点个数就行了. /** @Date : 2017-09-22 16:13:42 * @FileName: HDU 3926 ...

  2. hdu 3926 Hand in Hand 同构图

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3926 In order to get rid of Conan, Kaitou KID disguis ...

  3. hdu 3926 Hand in Hand

    http://acm.hdu.edu.cn/showproblem.php?pid=3926 这道题是判断两个图是不是同构相似.只要判断图中环的个数和链的个数,和每个环的节点数和链的节点数是否相等. ...

  4. hdu 3926 hands in hands

    https://vjudge.net/problem/HDU-3926 题意:有n个小朋友,他们之间手拉手,但是一只手只能拉一只手或者不拉,现在给出两个图,表示拉手关系,问这两个图是否同构.思路:一开 ...

  5. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  6. hdu图论题目分类

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  7. HDU图论题单

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  8. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

随机推荐

  1. 用户登录流程详解 +volley(StringRequest)

    在实习期间由于要求使用volley,所以第一次开始接触volley,从一开始的迷茫陌生,到疯狂的查找各种资料,通过在项目中用到的实际问题,我想做一些总结,所以写了这篇文章.下面我将介绍我理解的用户登录 ...

  2. DREAMWEAVER

    女孩儿!!!Coding之路,你没有什么不一样的!!!! 1024,程序员的节日,开会的时候,你对负责人说今天是我们的节日哎~~结果,得到的是负责人冷冰冰的眼神:“你还真把自己当程序员了!?” 一阵愣 ...

  3. 【leetcode】Gray Code (middle)

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  4. 【编程题目】如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)

    转自:http://blog.csdn.net/vast_sea/article/details/8167968 看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSor ...

  5. 【编程题目】在 O(1)时间内删除链表结点

    60.在 O(1)时间内删除链表结点(链表.算法).题目:给定链表的头指针和一个结点指针,在 O(1)时间删除该结点.链表结点的定义如下:struct ListNode{int m_nKey;List ...

  6. 【linux】nohup运行守护进程

    来源:http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051136.html nohup 命令 用途:不挂断地运行命令. 语法:nohup ...

  7. 【XLL 框架库函数】 InitFramework

    初始化框架库,它是简单的初始化临时 XLOPER/XLOPER12 内存结构,释放任何已经分配的内存. short WINAPI InitFramework(void); 参数 这个函数没有参数 备注 ...

  8. iOS- 如何改变section header

    希望这个从UITableViewDelegate协议里得到的方法可以对你有所帮助: - (UIView *) tableView:(UITableView *)tableView viewForHea ...

  9. 解决java.lang.NoClassDefFoundError: org/apache/log4j/Level

    现象: java.lang.NoClassDefFoundError: org/apache/log4j/Level at org.slf4j.LoggerFactory.getSingleton(L ...

  10. XPath的基本使用

    XPath XPath 使用路径表达式来选取 XML 文档中的节点或节点集. 路径表达式 结果 bookstore 选取 bookstore 元素的所有子节点. /bookstore 选取根元素 bo ...