https://vjudge.net/problem/HDU-3926

题意:
有n个小朋友,他们之间手拉手,但是一只手只能拉一只手或者不拉,现在给出两个图,表示拉手关系,问这两个图是否同构。
思路:
一开始被同构难住了,后来思考发现,每一个联通分量只能是一条链或者一个简单的环,这样就比较好判断了。利用并查集统计每一个连通分量中的点,然后判断类型,判断类型的时候用度数是否为1来判断是否为链,然后将每一个连通分量先根据大小,再根据类型进行排序,最后把两个图进行一个比较即可。

 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std; int fao[],fat[],d[];
vector<int> g[],v[]; struct node
{
int ty,sz;
}; node disc1[],disc2[]; void init1(int n)
{
for (int i = ;i <= n;i++)
{
fao[i] = i;
}
} void init2(int n)
{
for (int i = ;i <= n;i++)
fat[i] = i;
} int fin1(int x)
{
if (x == fao[x]) return x;
else return fao[x] = fin1(fao[x]);
} int fin2(int x)
{
if (x == fat[x]) return x;
else return fat[x] = fin2(fat[x]);
} void unit1(int x,int y)
{
x = fin1(x);
y = fin1(y); if (x != y) fao[x] = y;
} void unit2(int x,int y)
{
x = fin2(x);
y = fin2(y); if (x != y) fat[x] = y;
} int dfs1(int n)
{
for (int i = ;i < g[n].size();i++)
{
int t = g[n][i]; if (d[t] == ) return ;
} return ;
} int dfs2(int n)
{
for (int i = ;i < v[n].size();i++)
{
int t = v[n][i]; if (d[t] == ) return ;
} return ;
} bool cmp(node aa,node bb)
{
if (aa.sz == bb.sz)
return aa.ty < bb.ty;
return aa.sz < bb.sz;
} int main()
{
int t; scanf("%d",&t); int cas = ; while(t--)
{
memset(v,,sizeof(v));
memset(g,,sizeof(g));
memset(disc1,,sizeof(disc1));
memset(disc2,,sizeof(disc2));
memset(d,,sizeof(d)); int n,m; scanf("%d%d",&n,&m); init1(n); for (int i = ;i < m;i++)
{
int x,y; scanf("%d%d",&x,&y); d[x]++;
d[y]++; unit1(x,y);
} for (int i = ;i <= n;i++)
{
g[fin1(i)].push_back(i);
} int cnt1 = ; for (int i = ;i <= n;i++)
{
if (g[i].size() != )
{
disc1[cnt1].sz = g[i].size();
disc1[cnt1].ty = dfs1(i);
cnt1++;
}
} scanf("%d%d",&n,&m); init2(n); int cnt2 = ; memset(d,,sizeof(d)); for (int i = ;i < m;i++)
{
int x,y; scanf("%d%d",&x,&y); d[x]++;d[y]++; unit2(x,y);
} for (int i = ;i <= n;i++)
v[fin2(i)].push_back(i); for (int i = ;i <= n;i++)
{
if (v[i].size() != )
{
disc2[cnt2].sz = v[i].size();
disc2[cnt2].ty = dfs2(i);
cnt2++;
}
} sort(disc1,disc1 + cnt1,cmp);
sort(disc2,disc2 + cnt2,cmp); bool ff = ; if (cnt1 != cnt2) ff = ; for (int i = ;i < cnt1;i++)
{
if (disc1[i].sz != disc2[i].sz) ff = ;
if (disc1[i].ty != disc2[i].ty) ff = ;
} if (ff) printf("Case #%d: NO\n",++cas);
else printf("Case #%d: YES\n",++cas);
} return ;
}

hdu 3926 hands in hands的更多相关文章

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

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

  2. HDU 3926 图的同构

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3926 题意:给定2个顶点度最大为2的无向图.问你这2个无向图是否同构. 思路: 1.最大度为2.说明这 ...

  3. hdu 3926 Hand in Hand 同构图

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

  4. hdu 3926 Hand in Hand

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

  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. 学习Spark——那些让你精疲力尽的坑

    这一个月我都干了些什么-- 工作上,还是一如既往的写bug并不亦乐乎的修bug.学习上,最近看了一些非专业书籍,时常在公众号(JackieZheng)上写点小感悟,我刚稍稍瞄了下,最近五篇居然都跟技术 ...

  2. 纯css实现select下拉框并排显示

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Flex 布局:语法篇

    网页布局(layout)是 CSS 的一个重点应用.布局的传统解决方案,基于盒状模型,依赖 display 属性 + position 属性 + float 属性.它对于那些特殊布局非常不方便,比如, ...

  4. Delphi使用Zint生成QR二维条码(zint.dll)

    Delphi使用Zint生成QRCODE 本文使用的Zint Barcode Library(zint.dll)版本为2.6.0,和之前使用的2.4.3版本在zint_symbol这个结构体上会有差异 ...

  5. 放大镜原生js

    <!DOCTYPE html><html><head> <title></title> <style type="text/ ...

  6. 我的第一个Java程序

    我的第一个Java程序: class Test{    public static void main(String[] args)    {    System.out.println(" ...

  7. 解决(防止)DDOS攻击的另一种思想

    本方案适合作最后的处理方案. 在服务器遭到DDOS攻击后,防火墙.高防盾或者其他的方案都已经失去了效力,这时运维人员无任何方案可以处理,并且只能任由DDOS攻击或关闭服务器时,该方案可以有限的抵挡大部 ...

  8. 双核 CPU

    双核 CPU 时间限制: 1 Sec  内存限制: 128 MB 题目描述 由于越来越多的计算机配置了双核 CPU,TinySoft 公司的首席技术官员,SetagLilb,决定升级他们的产品-SWO ...

  9. 使用zabbix监控mysql的三种方式

    使用zabbix监控mysql的三种方式 1.只是安装agent 2.启用模板监控 3.启用自定义脚本的模板监控 zabbix中默认有mysql的监控模板.默认已经在zabbix2.2及以上的版本中. ...

  10. markdown基础

    介绍: markdown是一种可以使用普通文本编译器编写的标记语言,通过简单的标记语法,它可以使普通文本具有一定的格式.说的简单一点,markdown其实就是一种简单的文本,与普通的文本文件(txt文 ...