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

思路分析:题目可以看做一笔画问题,求最少画多少笔可以把所有的边画一次并且只画一次;

首先可以求出该无向图中连通图的个数,在每个无向连通图中求出需要画的笔数再相加即为所求。在一个无向连通图中,如果所有的点的度数为偶数则存在一个欧拉回路,

则只需要画一笔即可;如果图中存在度数为奇数的点,则需要画的笔数为度数为奇数的点的个数 /2;需要注意的孤立的点不需要画;

代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;const int MAX_N = 100000 + 100;
int fa[MAX_N], odd[MAX_N];
int link[MAX_N], set_count[MAX_N];void Init()
{for (int i = 0; i < MAX_N; ++i){set_count[i] = 1;fa[i] = i;}
}int Find(int num)
{if (fa[num] == num)return num;elsereturn fa[num] = Find(fa[num]);
}int Union(int a, int b)
{int fa_a = Find(a);int fa_b = Find(b);if (fa_a == fa_b)return -1;else if (fa_a > fa_b){fa[fa_b] = fa_a;set_count[fa_a] += set_count[fa_b];}else{fa[fa_a] = fa_b;set_count[fa_b] += set_count[fa_a];}return 1;
}int main()
{int vertex_num, road_num;int ver_1, ver_2;while (scanf("%d %d", &vertex_num, &road_num) != EOF){int ans = 0;Init();memset(link, 0, sizeof(link));memset(odd, 0, sizeof(odd));for (int i = 0; i < road_num; ++i){scanf("%d %d", &ver_1, &ver_2);link[ver_1]++;link[ver_2]++;Union(ver_1, ver_2);}for (int i = 1; i <= vertex_num; ++i){int fa = Find(i);if ((link[i] & 1) == 1)odd[fa]++;}for (int i = 1; i <= vertex_num; ++i){if (fa[i] == i && set_count[i] != 1){if (odd[i] == 0)ans++;elseans += odd[i] / 2;}}printf("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/tallisHe/p/4671818.html

hdoj 3018 Ant Trip(无向图欧拉路||一笔画+并查集)相关推荐

  1. HDU1116 Play on Words——欧拉路(有向图+并查集)

    点这里 题意: T组输入,每组输入有n个单词,要求将所有单词两两首尾相连,要求是前一个单词的最后一个字母和后一个单词的最后一个字母必须相同.如果能将所有单词连成一串,输出Ordering is pos ...

  2. POJ 1300 Door Man G++ 无向图欧拉路判定 背

    #include <iostream> #include <cstdio> #include <string> #include <cstring> u ...

  3. HDOJ3018欧拉路,几笔画判断

    //并查集+简单的欧拉路条数判断 #include <iostream> #include <cstring> #include <cstdio> using na ...

  4. hdu 3018 Ant Trip

    http://acm.hdu.edu.cn/showproblem.php?pid=3018 题意: 给出一张图,不能走重复边,可以几笔画遍历完所有的边 连通子图内如果没有度数为奇数的点,这个子图可以 ...

  5. HDU 3018 Ant Trip(一笔画问题)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3018 题意:每条边过且只过一次,问至少要画几笔才能全部边都经过..孤立的点忽视. 分析:首先,你用笔来画的 ...

  6. 无向图的连通分支数(并查集)

    目录 这是牛客网上题号为 KY268 的一道题 题目描述:该题的目的是要你统计图的连通分支数. 输入描述:每个输入文件包含若干行,每行两个整数 i, j,表示节点 i 和 j 之间存在一条边. 输出描 ...

  7. 图论--欧拉路,欧拉回路(小结)

    在题目中在慢慢细说概念 1.HDU - 3018 Ant Trip 题目大意:又N个村庄,M条道路.问须要走几次才干将全部的路遍历 解题思路:这题问的是有关欧拉路的判定 欧拉路就是每条边仅仅能走一次, ...

  8. #1182 : 欧拉路·三(有向图的欧拉路)

    #1182 : 欧拉路·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho破解了一道又一道难题,终于来到了最后一关.只要打开眼前的宝箱就可以通关这个游戏了 ...

  9. 加边的无向图(并查集)

    思路:加边个数等于连通块个数减一,因为是无向图可以用直接用并查集统计连通块个数. #include <cstdio> #include <cstring> #include & ...

最新文章

  1. 7.unity插件T4M使用
  2. python怎么安装numpy库-Python NumPy库的安装和使用
  3. 【Android工具】更新WPS全功能正版授权无广告版
  4. Uipath 学习栏目基础教学:5Uipath流程控制语句-整合
  5. golang中的go mod开发
  6. 430f149有几种封装类型_高速光调制器的发展与封装技术研究
  7. php OpenSSL 加解密
  8. android handler封装_Handler都没搞懂,你拿什么去跳槽啊?!
  9. 字符串查找字符出现次数_查找字符串作为子序列出现的次数
  10. python dataframe将字符转换为数字_python中如何将华氏温度转换为摄氏温度?
  11. 虚幻4引擎垃圾回收原理
  12. 个人任务五——事后诸葛亮项目回顾
  13. 全国建筑模架业内人士齐聚联筑赚 携手并进同发展
  14. 扫拖地机器人预留_扫地机器人需要注意几个点?拖扫组合受追捧!
  15. Docker部署若伊前后端分离项目到阿里云服务器
  16. python计算三角形面积_【Scratch算法编程】计算三角形面积
  17. java多线程归并排序_并行计算实验-串、并行排序算法
  18. 痞子衡嵌入式:可通过USB Device Path来唯一指定i.MXRT设备进行ROM/Flashloader通信
  19. 【转载】浮华背后与我的路
  20. Cosmos 与 PolkaDot 互解

热门文章

  1. OJ和PTA常见的错误代码含义
  2. 宁夏2021高考成绩查询,宁夏教育考试院:2021年宁夏高考成绩查询入口、查分系统...
  3. c语言指针生成numpy数组,python – 在cython中声明numpy数组和c指针
  4. win7 nginx php 环境,win7下docker环境搭建nginx+php-fpm+easyswoole+lavarel开发环境
  5. urllib.request.urlretrieve()函数
  6. 深入浅出——搞懂卷积神经网络的过拟合、梯度弥散、batchsize的影响的问题
  7. 机器学习中的损失函数(交叉熵损失、Hinge loss)
  8. 修改支付宝账号的授权方式
  9. 使用脚本将域账号添加到客户机的本地管理员组
  10. quickServer介绍