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

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

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <algorithm>
  4 #include <vector>
  5 using namespace std;
  6
  7 int fao[10004],fat[10004],d[10004];
  8 vector<int> g[10004],v[10004];
  9
 10 struct node
 11 {
 12     int ty,sz;
 13 };
 14
 15 node disc1[10004],disc2[10004];
 16
 17 void init1(int n)
 18 {
 19     for (int i = 1;i <= n;i++)
 20     {
 21         fao[i] = i;
 22     }
 23 }
 24
 25 void init2(int n)
 26 {
 27     for (int i = 1;i <= n;i++)
 28         fat[i] = i;
 29 }
 30
 31 int fin1(int x)
 32 {
 33     if (x == fao[x]) return x;
 34     else return fao[x] = fin1(fao[x]);
 35 }
 36
 37 int fin2(int x)
 38 {
 39     if (x == fat[x]) return x;
 40     else return fat[x] = fin2(fat[x]);
 41 }
 42
 43 void unit1(int x,int y)
 44 {
 45     x = fin1(x);
 46     y = fin1(y);
 47
 48     if (x != y) fao[x] = y;
 49 }
 50
 51 void unit2(int x,int y)
 52 {
 53     x = fin2(x);
 54     y = fin2(y);
 55
 56     if (x != y) fat[x] = y;
 57 }
 58
 59 int dfs1(int n)
 60 {
 61     for (int i = 0;i < g[n].size();i++)
 62     {
 63         int t = g[n][i];
 64
 65         if (d[t] == 1) return 0;
 66     }
 67
 68     return 1;
 69 }
 70
 71 int dfs2(int n)
 72 {
 73     for (int i = 0;i < v[n].size();i++)
 74     {
 75         int t = v[n][i];
 76
 77         if (d[t] == 1) return 0;
 78     }
 79
 80     return 1;
 81 }
 82
 83 bool cmp(node aa,node bb)
 84 {
 85     if (aa.sz == bb.sz)
 86         return aa.ty < bb.ty;
 87     return aa.sz < bb.sz;
 88 }
 89
 90 int main()
 91 {
 92     int t;
 93
 94     scanf("%d",&t);
 95
 96     int cas = 0;
 97
 98     while(t--)
 99     {
100         memset(v,0,sizeof(v));
101         memset(g,0,sizeof(g));
102         memset(disc1,0,sizeof(disc1));
103         memset(disc2,0,sizeof(disc2));
104         memset(d,0,sizeof(d));
105
106         int n,m;
107
108         scanf("%d%d",&n,&m);
109
110         init1(n);
111
112         for (int i = 0;i < m;i++)
113         {
114             int x,y;
115
116             scanf("%d%d",&x,&y);
117
118             d[x]++;
119             d[y]++;
120
121             unit1(x,y);
122         }
123
124         for (int i = 1;i <= n;i++)
125         {
126             g[fin1(i)].push_back(i);
127         }
128
129         int cnt1 = 0;
130
131         for (int i = 1;i <= n;i++)
132         {
133             if (g[i].size() != 0)
134             {
135                 disc1[cnt1].sz = g[i].size();
136                 disc1[cnt1].ty = dfs1(i);
137                 cnt1++;
138             }
139         }
140
141         scanf("%d%d",&n,&m);
142
143         init2(n);
144
145         int cnt2 = 0;
146
147         memset(d,0,sizeof(d));
148
149         for (int i = 0;i < m;i++)
150         {
151             int x,y;
152
153             scanf("%d%d",&x,&y);
154
155             d[x]++;d[y]++;
156
157             unit2(x,y);
158         }
159
160         for (int i = 1;i <= n;i++)
161             v[fin2(i)].push_back(i);
162
163         for (int i = 1;i <= n;i++)
164         {
165             if (v[i].size() != 0)
166             {
167                 disc2[cnt2].sz = v[i].size();
168                 disc2[cnt2].ty = dfs2(i);
169                 cnt2++;
170             }
171         }
172
173         sort(disc1,disc1 + cnt1,cmp);
174         sort(disc2,disc2 + cnt2,cmp);
175
176         bool ff = 0;
177
178         if (cnt1 != cnt2) ff = 1;
179
180         for (int i = 0;i < cnt1;i++)
181         {
182             if (disc1[i].sz != disc2[i].sz) ff = 1;
183             if (disc1[i].ty != disc2[i].ty) ff = 1;
184         }
185
186         if (ff) printf("Case #%d: NO\n",++cas);
187         else printf("Case #%d: YES\n",++cas);
188     }
189
190     return 0;
191 }

转载于:https://www.cnblogs.com/kickit/p/7147030.html

hdu 3926 hands in hands相关推荐

  1. HDU 3926 图的同构

    Hand in Hand 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3926 Problem Description In order to get ...

  2. hdu 3926 Hand in Hand (图同构)

    这题就是判断图是否同构. 题意:有n个小朋友,他们之间手牵手形成了一张图.而且不会有超过三只手牵在一起. 简单说就算给你两张图,判断两个图是否同构. 思路:因为不会有超过三只手牵在一起,既每个节点的度 ...

  3. 杭电OJ分类题目(4)-Graph

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(4) HDU Graph Theory - U ...

  4. 图论500题 慢慢写

    题目来源 https://blog.csdn.net/ffq5050139/article/details/7832991 这篇博客用来记录自己刷的图论题 先占个坑 所有题目都来自上面的链接 会慢慢更 ...

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

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

  6. HDU——1106排序(istringstream的使用、STLvector练习)

    排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  7. hdu 5438 Ponds 拓扑排序

    Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...

  8. HDU 1248 寒冰王座(全然背包:入门题)

    HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...

  9. hdu 1312 Red and Black 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 第二条深搜,题目并不难,但是做了我好久好久,由于一个细节,让我赌上了一个晚上的时间. 题目大意: ...

  10. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

最新文章

  1. matlab求解外弹道,基于MATLAB∕Simulink的通用质点外弹道程序设计.pdf
  2. Zabbix+shell监控报警任意web
  3. lucene教程--全文检索技术详解
  4. 如何使用Hibernate从Play生成DDL脚本! 框架项目
  5. vscode中vue代码高亮_Vue中添加友盟代码统计
  6. 蓝桥杯dfs搜索专题
  7. MySQL集群Cluste详解(二)——配置实战
  8. 机器学习 流式特征_Web服务与实时机器学习端点的流式传输
  9. VMware安装Windows Server 2003提示Operating System not found
  10. PPAPI插件开发指南
  11. 计算机制图知识点,工程制图的基础知识
  12. python批量剪切视频文件
  13. 程序员内功修炼——内省、反射与注解
  14. OKR-VUCA时代目标管理利器实践分享
  15. 阿里面试官内部题库,阿里发布2022年Java岗(正式版)面试题
  16. 使用CS发送钓鱼邮件
  17. 英语学习经验分享(四六级、竞赛、口语)
  18. 315Mhz RF射频解码 串口输出方案(支持2262/1527多种编码方式)
  19. 前端整理 —— 公司项目开发
  20. (图文)自己组建自己迷你linux系统

热门文章

  1. 任务调度在分布式部署环境下保证task的正确运行
  2. Web前端:javascript实现图片轮播
  3. struts实现文件下载
  4. Java EE开发四大常用框架(1)
  5. 最新Tuxera NTFS for mac2020读写NTFS磁盘工具 更新详情介绍
  6. Ubuntu下Eclipse中文乱码解决
  7. 基于 Sharding Sphere,实现数据 “一键脱敏”!
  8. “我的开源项目被科技巨头拿去做产品了,注释中连名字都被删掉了”
  9. 你写得API接口代码真是一坨屎,难道不能对返回格式统一处理一下吗?
  10. 海外硕士苏明哲回国后哀叹:我美本英硕,找不到工作很难受