博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdoj 3018 Ant Trip(无向图欧拉路||一笔画+并查集)
阅读量:5156 次
发布时间:2019-06-13

本文共 1829 字,大约阅读时间需要 6 分钟。

题目链接:

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

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

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

 

代码如下:

#include 
#include
#include
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; else return 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++; else ans += odd[i] / 2; } } printf("%d\n", ans); } return 0;}

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

你可能感兴趣的文章
CND网站加速
查看>>
curl 简单使用
查看>>
百度地图坐标之间的距离php
查看>>
编辑器上传漏洞
查看>>
HPU--1189 Ou à
查看>>
java web中Jdbc访问数据库步骤通俗解释(吃饭),与MVC的通俗解释(做饭)
查看>>
个人笔记(1)
查看>>
Android5.0水波纹效果ripple实现
查看>>
Windows 7 添加SSD硬盘后重启卡住正在启动
查看>>
PHP3个魔术方法
查看>>
《背影》----朱自清
查看>>
委托匿名方法
查看>>
nginx的gzip压缩
查看>>
Css 基本的规则写法
查看>>
机器人的运动范围
查看>>
耳放一块
查看>>
BZOJ3442: 学习小组
查看>>
让打开文件夹直接在某路径打开
查看>>
【Android界面实现】Drawable Animation 使用介绍
查看>>
【SAS】REG过程详解
查看>>