这题就是判断图是否同构。

题意:有n个小朋友,他们之间手牵手形成了一张图。而且不会有超过三只手牵在一起。 简单说就算给你两张图,判断两个图是否同构。

思路:因为不会有超过三只手牵在一起,既每个节点的度最多为2。所以对于图中的每个顶点要么在一个环中,要么在一条链中。这样要判断图是否同构的话,可以判断两张图中,环的数目和每个换种的节点数是否相等,还有链的数目以及每条链中的节点数目是否相等。这个过程可以用STL的multiset来完成。
找环的话,只要在dfs的时候判断节点是否被访问过,如果被访问过,并且不是当前节点的父节点的话,则改连通分量是一个环。这里说的父节点是dfs序。
说到图同构,08年的区域赛这题也很类似,不过因为节点只有8个,可以通过暴力方法判断。
http://acm.hdu.edu.cn/showproblem.php?pid=2464

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 10;vector<int> G1[maxn];
vector<int> G2[maxn];vector<bool> sign1, sign2;void dfs(int cur, int fa, bool& ring, int& size, vector<int> G[maxn], vector<bool>& sign) {size++;sign[cur] = true;for (auto& val : G[cur]) {if (sign[val] == false) {dfs(val, cur, ring, size, G, sign);}else if (sign[val] == true && val != fa) {ring = true;}}
}int main() {ios::sync_with_stdio(false);int t;cin >> t;int cases = 0;while (t--) {int n1, m1;int n2, m2;int i, j;cin >> n1 >> m1;sign1.clear();sign1.resize(n1 + 10);for (i = 0; i <= n1; i++) {G1[i].clear();}int a, b;for (i = 0; i < m1; i++) {cin >> a >> b;G1[a].push_back(b);G1[b].push_back(a);}cin >> n2 >> m2;sign2.clear();sign2.resize(n2 + 10);for (i = 0; i <= n2; i++) {G2[i].clear();}for (i = 0; i < m2; i++) {cin >> a >> b;G2[a].push_back(b);G2[b].push_back(a);}//if (n1 != n2 || m1 != m2) {//    cout << "Case #" << ++cases << ": NO" << endl;//    continue;//}multiset<int> ring1, ring2;multiset<int> link1, link2;for (i = 1; i <= n1; i++) {if (!sign1[i]) {bool ring = false;int size = 0;dfs(i, -1, ring, size, G1, sign1);if (ring) {ring1.insert(size);}else {link1.insert(size);}}}for (i = 1; i <= n2; i++) {if (!sign2[i]) {bool ring = false;int size = 0;dfs(i, -1, ring, size, G2, sign2);if (ring) {ring2.insert(size);}else {link2.insert(size);}}}if (ring1 == ring2 && link1 == link2) {cout << "Case #" << ++cases << ": YES" << endl;}else {cout << "Case #" << ++cases << ": NO" << endl;}}return 0;
}

讲道理,这就是一个道水题,但还是被坑了很久,wa了三四发。一开始以为是思路还是dfs写错了。找了半天,发现是sign1数组出锅了。一开始每次sign1和sign2都只是进行resize()而且。但是忘了resize并不会改变已有的值。如果是这样的话,应该是样例就过不去的。但是我刚开始为了省事,所以加了下代码中注释的部分。导致第二个cases没用经过dfs就直接输出结果了。让我错以为没啥错。 要不是试着把这个部分删了试试看,还真找不到错误。。

汗,第N 次在STL上栽了。在此记录一下自己犯得傻。

        if (n1 != n2 || m1 != m2) {cout << "Case #" << ++cases << ": NO" << endl;continue;}

hdu 3926 Hand in Hand (图同构)相关推荐

  1. HDU 3926 图的同构

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

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

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

  3. 图论500题 慢慢写

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

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

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

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

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

  6. hdu 5438 Ponds 拓扑排序

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

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

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

  8. hdu 1312 Red and Black 解题报告

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

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

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

最新文章

  1. 开放封闭原则(OCP)
  2. hyundai-wia
  3. DDoS攻防战(三):ip黑白名单防火墙frdev的原理与实现
  4. Freeswitch之ASR(语音识别)总结大全
  5. 科技计划项目数据管理过程模型
  6. 智能语音识别系统_语音识别技术原理_智能语音识别系统如何识别用户意图_企业服务汇...
  7. 易语言学习笔记(一)
  8. 数据结构笔记(二十三)--哈夫曼树
  9. 计算机应用基础演讲怎么开口,计算机应用基础讲课稿
  10. TableViewCell 自定义分割线
  11. CocoStudio1.3 场景编辑器使用
  12. fn键台式计算机在哪,fn键在哪?小鱼教您fn键使用方法
  13. QQ.阿里旺旺.淘宝.在线网页链接代码及详解
  14. python轮子下载教程
  15. 【学习OpenCV4】键盘鼠标操作总结
  16. 激光打印机的工作原理2
  17. 家乐福618安全与性能保卫战(一)-安全高地保卫战
  18. Python爬取wallhaven壁纸 2023.1.31
  19. android camera分辨率设置,如何使用OpenCV在Android中设置相机分辨率?
  20. ubuntu20安装出现致命错误_Ubuntu 20.04 依赖包安装错误解决方案

热门文章

  1. 荣耀手机无法升级鸿蒙,荣耀手机不能升级鸿蒙了?博主给出升级名单
  2. mysql-建新用户与删除用户并限制ip登录
  3. Linux基本命令的使用
  4. 三行代码把女朋友照片变成了素描图片!人生苦短,爱python多一些
  5. php支付宝第三方授权,thinkphp支付宝,微信第三方支付(PC版)
  6. 2021年5月-国家注册审核员-《认证通用基础》真题7-解析版
  7. 鸿蒙os3.0评测,华为P50Pro+:徕卡3+2双环镜头,麒麟9000芯片配鸿蒙OS3.0
  8. FinalShell,免费好用的国产ssh连接工具
  9. Python爬取全民小视频网站视频,可爬取全站视频
  10. ios开发怎么接入面容id_Flutter混合开发