NYOJ 42 一笔画问题
一笔画问题
- 描述
-
zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。
规定,所有的边都只能画一次,不能重复画。
- 输入
- 第一行只有一个正整数N(N<=10)表示测试数据的组数。
每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P)
随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线。 - 输出
- 如果存在符合条件的连线,则输出"Yes",
如果不存在符合条件的连线,输出"No"。 - 样例输入
-
2
4 3
1 2
1 3
1 4
4 5
1 2
2 3
1 3
1 4
3 4 - 样例输出
-
No
Yes
本题来自:http://acm.nyist.net/JudgeOnline/problem.php?pid=42
问题分析:
欧拉定理 如果一个网络是连通的并且奇顶点的个数等于0或2,那么它可以一笔画出;否则它不可以一笔画出。
判断一笔画的方法:
①是连通的。一个图,如果图上任意二点总有线段连接着,就称为连通的。不是连通的就不能一笔画出。
②奇点个数是0或者是2。图上线段的端点可以分成二类,奇点和偶数。一个点,以它为端点的线段数是奇数就称为奇点,线段数是偶数就称为偶点。
一个图是否是一笔画就看奇点的个数,奇点个数是 0 或者 2,就是一笔画,否则就不是一笔画。
所以这个问题完全可以转化策略为:
第一步: 首先我们不管它三七二十几,先进行连通性的判断。
第二步:
(1)如果是连通的,我们来判断此图的度的奇点的个数是0或者是2 ,如果是,则说明这个是欧拉图,即可以一笔画出,反之则不能一笔画出
(2)如果是非连通的,这说明这个图很定不能一笔画出。
代码一:——深搜
#include <stdio.h>
#include <string.h>
int P,Q;
int bian[];
bool map[][],vis[];
void dfs(int cur)
{
vis[cur]=true;
for(int i=;i<=P;i++)
if(map[cur][i])
{
bian[cur]++;
if(!vis[i])
dfs(i);
}
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int ok=;
memset(map,false,sizeof(map));
memset(vis,false,sizeof(vis));
memset(bian,,sizeof(bian)); scanf("%d%d",&P,&Q); for(int i=;i<Q;i++)
{
int A,B;
scanf("%d%d",&A,&B);
map[A][B]=true,map[B][A]=true;
} dfs(); // 判断是否连通的,如果vis有个false,就不是连通的 for(int i=;i<=P;i++)
if(!vis[i])
{
ok=;
break;
} if(!ok)printf("No\n");
else
{
int xx=;
for(int i=;i<=P;i++)
if(bian[i]%)xx++;
if(xx==||xx==)printf("Yes\n");
else printf("No\n");
}
}
return ;
}
在AC后,网上看到别人的思路,还有一种方法来判断连通性——并查集。
并查集资料:http://www.cnblogs.com/cyjb/p/UnionFindSets.html
代码二:——并查集
//并查
#include<stdio.h>
#include<string.h>
int father[],ans[];
void init()
{
for(int i=;i<;i++)
father[i]=i;
}
int find(int x)
{
if(father[x]==x)
return x;
else
return father[x]=find(father[x]);
}
int main()
{
int ncases,n,m,x,y,count,jdcount;
scanf("%d",&ncases);
while(ncases--)
{
memset(ans,,sizeof(ans));
init();
count=jdcount=;
scanf("%d %d",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%d %d",&x,&y);
ans[x]++; ans[y]++;
x=find(x); y=find(y);
if(x!=y)
father[x]=father[y];
} for(i=;i<=n;i++)
if(find(i)==i)
count++;
for(i=;i<=n;i++)
if(ans[i]%==)
jdcount++;
if((jdcount==||jdcount==)&&count==)
printf("Yes\n");
else
printf("No\n");
}
}
NYOJ 42 一笔画问题的更多相关文章
- nyoj 42 一笔画 欧拉通路
http://acm.nyist.net/JudgeOnline/problem.php?pid=42 一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc ...
- nyoj 42 一笔画问题 欧拉路径
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=42 欧拉回路,欧拉路径水题~ 代码: #include "stdio.h&quo ...
- NYOJ 42 一笔画问题 (并查集+欧拉回路 )
题目链接 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数 ...
- NYOJ 42 一笔画
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...
- HDOJ 1878 欧拉回路 nyoj 42一笔画问题
#include<cstdio> #include<cstring> ]; int find(int x) { if(visited[x]!=x) return find(vi ...
- nyoj 42
#include <iostream> #include <stdio.h> #include <cstring> #include <algorithm&g ...
- NYOJ 题目42 一笔画问题
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...
- NYOJ 题目42 一笔画问题(欧拉图)
一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描写叙述 zyc从小就比較喜欢玩一些小游戏.当中就包含画一笔画.他想请你帮他写一个程序.推断一个图是否可以用一笔画下 ...
- nyist 42 一笔画 (欧拉回路 + 并查集)
nyoj42 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径. 若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路 ...
随机推荐
- C# 调用 WebService 连接ORACLE 11g
这几天开发一个WebService遇到很多问题,记录下来顺便帮助一下以后遇到情况的人. 我是通过ADO.NET来连接ORACLE的,也可以用ORACLE提供的ODP.NET. 通过正常的连接后部署II ...
- [LeetCode] Number of Islands II
Problem Description: A 2d grid map of m rows and n columns is initially filled with water. We may pe ...
- MMO之禅(二)职业精神
MMO之禅(二)职业精神 --心态 目标 信仰 Zephyr 201304 继续上篇,继续讲什么?打了很多腹稿点滴,从引擎架构,到上层数据.逻辑模块规划,想了很多,临起笔,却总发觉四顾心茫然,乱不可言 ...
- Apache配置多个网站的方法
Apache的虚拟主机是一种允许在同一台机器上,运行超过一个网站的解决方案.虚拟主机有两种,一种叫基于IP的(IP-based),另一种叫基于名字的(name-based).虚拟主机的存在,对用户来说 ...
- 读书笔记_Effective_C++_条款四十六:需要类型转换时请为模板定义非成员函数
这个条款可以看成是条款24的续集,我们先简单回顾一下条款24,它说了为什么类似于operator *这样的重载运算符要定义成非成员函数(是为了保证混合乘法2*SomeRational或者SomeRat ...
- TWaver家族新成员 — Legolas工业自动化设计平台
对于TWaver可视化家族的成员,大家比较熟悉的是我们的网络拓扑图组件和MONO Design三维建模工具.作为开发工具,这两款产品面向广大的程序猿同志,在界面可视化上为大家省时省力.但是,当项目交付 ...
- Android代码优化——使用Android lint工具
作为移动应用开发者,我们总希望发布的apk文件越小越好,不希望资源文件没有用到的图片资源也被打包进apk,不希望应用中使用了高于minSdk的api,也不希望AndroidManifest文件存在异常 ...
- 七牛portal可用性测试记
引言:2013年年底应七牛公司朋友的邀请,给他们的Portal进行可用性测试.七牛(http://www.qiniu.com/)一直专注于云存储基础服务,在业内颇有声誉.七牛云存储的后台选用并不常用的 ...
- bootstrap插件学习-bootstrap.carousel.js
先看bootstrap.carousel.js的结构 var Carousel = function (element, options){} //构造器 Carousel.prototype = { ...
- 2014.7.12 敏捷个人奥森健步走&敏友分享会.活动报道
今天是个阳光明媚的日子,正式开起了敏捷个人2014年每月一次的健步走&读书分享活动. 周老师一大早8点就到了森林公园南门,一边看书一边等候敏友们的到来.时间走到了9点半,大家基本到齐了,我们准 ...