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图).具有欧拉路 ...
随机推荐
- CCF(管道清洁):最小费用最大流
管道清洁 201812-5 需要清洁的管道下界为1, 不需要清洁的管道下界为0, 可重复经过的管道上界为正无穷, 不可重复经过的管道上界为1. 这属于无源无汇的有容量下界的最小费用可行流.解决的方法就 ...
- 腾讯云容器服务 TKE 拿下新加坡 MTCS 最高级别安全认证
近日,腾讯云容器服务 TKE 荣获新加坡 MTCS 最高级安全认证,标志着腾讯云 TKE 在为用户提供可靠.易部署.灵活扩展等基础服务上,已经全面满足了新加坡监管机构以及多个行业客户对服务安全的要求. ...
- javaweb遇到的报错及解决方式
javaweb报错问题以及解决方案 问题(报错信息):Application Server was not connected before run configuration stop, reaso ...
- Debian中的NVIDIA显卡驱动安装——超简单,一行命令
其实Debian的non-free固件中包含NVIDIA的显卡驱动,所以没必要在官网下run包一步一步来 sudo apt install nvidia-settings 安装时会提示与X冲突,没关系 ...
- 简历求职:STAR法则
做了近2年的大学生就业辅导工作,也接触了很多即将走出校园的大学生,做个总结与大家分享,同时也是对自己的一个总结. 最近刚听说STAR法则,这也是一直我们给学生的指导思想,百度了一下: STAR法则,即 ...
- golang实现已知三角形三点坐标,求三角形面积
代码如下: func GetTriangleAreaByVector(x vector.Vector3,y vector.Vector3,z vector.Vector3) float64 { //根 ...
- fianl关键词
一.final关键字概述 final关键字具有最终或不可改变的含义,可用于修饰类.变量.方法.因此被final修饰的类.变量.方法具有以下特征: --final修饰的类不能被继承: --final修饰 ...
- python3 多线程爬虫模板
原文:https://www.jianshu.com/p/06ae2373f560 1 import threading # 多线程模块 2 import queue # 队列模块 3 import ...
- 攻防世界 reverse 进阶 10 Reverse Box
攻防世界中此题信息未给全,题目来源为[TWCTF-2016:Reverse] Reverse Box 网上有很多wp是使用gdb脚本,这里找到一个本地还原关键算法,然后再爆破的 https://www ...
- [题解] T'ill It's Over
前言 线段树+网络最大流的建模题. 博客园食用更佳 题目大意 最初时有 \(n\) 个 \(1\) .给定 \(op\) . \(l\) ,其中, \(l\) 为操作次数上限.你有四个操作: 若 \( ...