hdu3018 一笔画问题
题意:
给你一幅画,这幅画由点和边构成,问你最少几笔能把这幅画画完。
思路:
这个题目的结论比较巧妙,首先我们考虑下,如果给的图是欧拉图,或者是条欧拉回路,那么我们一笔就搞定了,那么我们可以把图的每一个部分<联通快>都检查一遍,如果是
连通块,那么就直接+1,如果不是欧拉回路<包括欧拉路>,那么我们就要统计这个连通块的度数为奇数的点的个数s, 答案+s/2,原因是我们可以用s/2笔把所有的奇数度都填充完,一次填充两个,当最后一笔的时候整个连通块已经是一个欧拉回路了,然后我们必要把最后一笔抬起来,直接一笔画就行了,还有就是提示下s永远都是偶数,因为每当添加一笔的时候有四种情况新添加的这条边的两个端点 分别产生两个度数为奇数的 + 2
分别消除两个度数为奇数的 -2 分别一个消除,一个增加 +1-1 所以买个连通块的奇数度点的个数很定是偶数个,总之最优的策略就是用最少的步数把每个一个连通块变成欧拉回路,然后一笔搞定,还有就是要明确,我们并不是在填边,而是说需要填边的地方就是我们台笔的地方,也就是要多花费一笔的地方。还有提示一点,可能出现独立的一个点,独立的点不用画,其他的具体细节看代码。
#include<stdio.h>
#include<string.h> #define N_node 110000
#define N_edge 110000
typedef struct
{
int to ,next;
}STAR; STAR E[N_edge];
int list[N_node] ,tot;
int mer[N_node] ,du[N_node]; void add(int a ,int b)
{
E[++tot].to = b;
E[tot].next = list[a];
list[a] = tot;
} int finds(int x)
{
return x == mer[x] ? x : mer[x] = finds(mer[x]);
} int main ()
{
int i ,j ,n ,m ,a ,b;
while(~scanf("%d %d" ,&n ,&m))
{
for(i = 1 ;i <= n ;i ++) mer[i] = i;
memset(du ,0 ,sizeof(du));
for(i = 1 ;i <= m ;i ++)
{
scanf("%d %d" ,&a ,&b);
mer[finds(a)] = finds(b);
du[a] ++ ,du[b] ++;
}
memset(list ,0 ,sizeof(list)) ,tot = 1;
for(i = 1 ;i <= n ;i ++)
{
int x = finds(i);
if(x == i) continue;
add(x ,i);
}
int Ans = 0;
for(i = 1 ;i <= n ;i ++)
{
int tsum = 0;
int x = finds(i);
if(i != x || i == x && !list[x]) continue;
tsum = du[i] % 2;
for(int k = list[x] ;k ;k = E[k].next)
tsum += du[E[k].to] % 2;
(!tsum)? tsum ++ : tsum /= 2;
Ans += tsum;
}
printf("%d\n" ,Ans);
}
return 0;
}
hdu3018 一笔画问题的更多相关文章
- HDU3018 几笔画(非1笔)
Ant Trip Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- [置顶] hdu3018解题报告--也是白话几笔画学习总结
1.题意 2.分析难点(结合图形) 1.首先说说题意吧...题意很简单...但是一开始很菜的我就很迷惑..在想啊...题目怎么就会有没有连接边的点呢....因为你每次给出一条边..就把 a,b连接啦. ...
- nyoj-一笔画问题-欧拉图+联通判定
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...
- fcitx 候选词出现奇怪的笔画
原来fcitx还有笔画输入的功能,输入h出现一个横,s出现竖,p是撇,n是捺,z是折. 虽然很有意思,但是不实用,而且还会出现在第一页候选词中,影响输入,可以通过配置文件禁用掉: $ vim ~/.c ...
- NYOJ 42 一笔画问题
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...
- ACM题目————一笔画问题
描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N< ...
- nyoj-----42一笔画问题
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...
- UVA 291 The House Of Santa Claus (DFS求一笔画)
题意:从左下方1开始,一笔画出圣诞老人的屋子(不过话说,圣诞老人的屋子是这样的吗?这算是个屋子么),输出所有可以的路径. 思路:贴代码. #include <iostream> #incl ...
- nyist 42 一笔画 (欧拉回路 + 并查集)
nyoj42 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径. 若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路 ...
随机推荐
- 关于 C++ 中的强制转换 - 基础篇
引言 假设有基类 A,包含了虚函数 func1,以及有派生类 B,继承于类 A,派生类 B 中实现了函数 func1.此时可以用 A 类型的指针指向 B 类型的对象,并用 A 类型的指针调用 B 类型 ...
- CVE-2017-12149-JBoss 5.x/6.x 反序列化
漏洞分析 https://www.freebuf.com/vuls/165060.html 漏洞原理 该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter 过 ...
- spring基础:什么是框架,框架优势,spring优势,耦合内聚,什么是Ioc,IOC配置,set注入,第三方资源配置,综合案例spring整合mybatis实现
知识点梳理 课堂讲义 1)Spring简介 1.1)什么是框架 源自于建筑学,隶属土木工程,后发展到软件工程领域 软件工程中框架的特点: 经过验证 具有一定功能 半成品 1.2)框架的优势 提高开发效 ...
- Mark一个代码量统计工具-Statistic
安装方式 IDEA.Goland系列插件市场搜索Statistic 简单说明 统计纬度比较丰富 基本覆盖常见纬度,如代码行数,文件大小等,各指标取最大最小及平均值. 统计目录为当前项目目录 只有在当前 ...
- C语言入门--初来乍到
Hi,我是fish-studio,这是我写的第一篇博客,接下来我会以萌新的角度来与大家一起学习C语言,我也不是什么大佬,在我写的教程中会尽量详细的把我遇到的问题写出来,也会结合一些网上的文章进行编写, ...
- 如何强制删除一个apk
有些apk安装完后无法卸载,现在收集了一些方法,以及个人的一些手段. 1. 假设该app名为ketech,安装包名为ketech.apk. 2. 查看/data/app里面是否有名称包含ketech的 ...
- java 实现快速排序
package leetcode;public class Singleton { public static void sort(int[] array,int low,int high){ int ...
- maven 常用命名
maven项目,在命令行中操作,非常简洁.高效,现将maven项目常用命令行总结如下: maven命令行命令总结 序号 整理 统计 命令 作用 1 基本 5 mvn -v 查看maven版本 2 mv ...
- Docker 专题总结
Docker 专题总结 Docker 的基本命令 启动 Docker $ systemctl start docker 停止Docker $ systemctl stop docker 重启Docke ...
- [go-linq]-Go的.NET LINQ式查询方法
关于我 我的博客|文章首发 开发者的福音,go也支持linq了 坑爹的集合 go在进行集合操作时,有很不舒服的地方,起初我真的是无力吐槽,又苦于找不到一个好的第三方库,只能每次写着重复代码.举个栗子 ...