hdu 3926 hands in hands
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相关推荐
- HDU 3926 图的同构
Hand in Hand 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3926 Problem Description In order to get ...
- hdu 3926 Hand in Hand (图同构)
这题就是判断图是否同构. 题意:有n个小朋友,他们之间手牵手形成了一张图.而且不会有超过三只手牵在一起. 简单说就算给你两张图,判断两个图是否同构. 思路:因为不会有超过三只手牵在一起,既每个节点的度 ...
- 杭电OJ分类题目(4)-Graph
原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(4) HDU Graph Theory - U ...
- 图论500题 慢慢写
题目来源 https://blog.csdn.net/ffq5050139/article/details/7832991 这篇博客用来记录自己刷的图论题 先占个坑 所有题目都来自上面的链接 会慢慢更 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- HDU——1106排序(istringstream的使用、STLvector练习)
排序 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...
- hdu 5438 Ponds 拓扑排序
Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...
- HDU 1248 寒冰王座(全然背包:入门题)
HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...
- hdu 1312 Red and Black 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 第二条深搜,题目并不难,但是做了我好久好久,由于一个细节,让我赌上了一个晚上的时间. 题目大意: ...
- HDU 1429 胜利大逃亡(续) (BFS+位压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) ...
最新文章
- matlab求解外弹道,基于MATLAB∕Simulink的通用质点外弹道程序设计.pdf
- Zabbix+shell监控报警任意web
- lucene教程--全文检索技术详解
- 如何使用Hibernate从Play生成DDL脚本! 框架项目
- vscode中vue代码高亮_Vue中添加友盟代码统计
- 蓝桥杯dfs搜索专题
- MySQL集群Cluste详解(二)——配置实战
- 机器学习 流式特征_Web服务与实时机器学习端点的流式传输
- VMware安装Windows Server 2003提示Operating System not found
- PPAPI插件开发指南
- 计算机制图知识点,工程制图的基础知识
- python批量剪切视频文件
- 程序员内功修炼——内省、反射与注解
- OKR-VUCA时代目标管理利器实践分享
- 阿里面试官内部题库,阿里发布2022年Java岗(正式版)面试题
- 使用CS发送钓鱼邮件
- 英语学习经验分享(四六级、竞赛、口语)
- 315Mhz RF射频解码 串口输出方案(支持2262/1527多种编码方式)
- 前端整理 —— 公司项目开发
- (图文)自己组建自己迷你linux系统
热门文章
- 任务调度在分布式部署环境下保证task的正确运行
- Web前端:javascript实现图片轮播
- struts实现文件下载
- Java EE开发四大常用框架(1)
- 最新Tuxera NTFS for mac2020读写NTFS磁盘工具 更新详情介绍
- Ubuntu下Eclipse中文乱码解决
- 基于 Sharding Sphere,实现数据 “一键脱敏”!
- “我的开源项目被科技巨头拿去做产品了,注释中连名字都被删掉了”
- 你写得API接口代码真是一坨屎,难道不能对返回格式统一处理一下吗?
- 海外硕士苏明哲回国后哀叹:我美本英硕,找不到工作很难受