博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1636 Einstein学画画
阅读量:6801 次
发布时间:2019-06-26

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

P1636 Einstein学画画

题目描述

Einstein学起了画画,

此人比较懒~~,他希望用最少的笔画画出一张画。。。

给定一个无向图,包含n 个顶点(编号1~n),m 条边,求最少用多少笔可以画出图中所有的边

输入输出格式

输入格式:

 

第一行2个数n,m

以下m行 每行2个数a,b(a<>b) 表示a,b两点之间有一条边相连

一条边不会被描述多次

 

输出格式:

 

一个数 即问题的答案

 

输入输出样例

输入样例#1:
5 52 32 42 53 44 5
输出样例#1:
1

说明

约定 50%的数据n<=50,m<=100

100%的数据n<=1000,m<=100000

 

分析:

 

一笔画判断:奇点数为2或0或大于2且不被2整除的图

X笔画判断: 奇点数为1及2以上的图,奇点数为N,则X=N整除2

 

本题其实就是考察简单半欧拉图及其扩展定理,设顶点的度数为连接的边数,然后统计所有顶点中度数为奇数的顶点的个数n,则答案一定为n/2。

首先,根据握手定理,所有顶点的度数之和一定为偶数。则奇数顶点的个数一定为偶数。然后每画一笔,最多可以使奇数顶点个数减少两个(或者不减少),所以一定至少要n/2笔,才能把画画完。

有一个特殊情况,即为所有点构成一个环的情况。此时n=0,但实际上需要一笔画完(即欧拉图),所以需要特判一下。

 

这个题目如果部分点成环了怎么办??

 

1 #include
2 #include
3 using namespace std; 4 int b[10001]; 5 int main() 6 { 7 //freopen("in.txt","r",stdin); 8 int n,m,i,j,k,geshu=0,x,y; 9 scanf("%d%d",&n,&m);10 for (i=1;i<=m;i++)//运用定理11 {12 //运用定理 13 scanf("%d%d",&x,&y);//运用定理14 b[x]++;//运用定理15 b[y]++;//运用定理16 }17 //运用定理18 for (i=1;i<=n;i++)19 if (b[i]%2==1)//判断度数20 geshu++;21 if (geshu)22 printf("%d",geshu/2);23 else//特判24 printf("%d",geshu+1);25 }

 

转载地址:http://qxuwl.baihongyu.com/

你可能感兴趣的文章
Spark生态顶级项目汇总
查看>>
EF Core 2.1路线图:视图、GROUP BY和惰性加载
查看>>
NetBeans在Apache基金会取得的进展
查看>>
Netflix实时流处理平台Keystone介绍
查看>>
一文带你快速读懂.NET CLI
查看>>
深入探索JVM自动资源管理
查看>>
实现TeX的算法:回首编程技术的过去三十年
查看>>
re:Invent大会第四天:为什么Lambda值得你更多关注?
查看>>
B端大数据应用的架构实践与思考
查看>>
Cascade:自动化测试“旅程”
查看>>
2018年十大云宕机事故盘点:主流无一幸免!
查看>>
美团开源实时监控系统 CAT 3.0 发布:多语言客户端及多项性能提升
查看>>
开源项目koa-router被叫卖,周下载10W+只要5000美元
查看>>
360首席安全官谭晓生宣布离职
查看>>
微软正式发布Azure Functions 2.0
查看>>
Swift 4.2进入最后开发阶段,为Swift 5铺平道路
查看>>
爱立信电信软件的持续交付
查看>>
Oracle提醒Java开发者们,很快就没有浏览器可以运行Applets了
查看>>
《The Age of Surge》作者访谈
查看>>
GitHub发布开源许可证使用情况
查看>>