一笔画问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
 
描述

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 一笔画问题的更多相关文章

  1. nyoj 42 一笔画 欧拉通路

    http://acm.nyist.net/JudgeOnline/problem.php?pid=42 一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc ...

  2. nyoj 42 一笔画问题 欧拉路径

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=42 欧拉回路,欧拉路径水题~ 代码: #include "stdio.h&quo ...

  3. NYOJ 42 一笔画问题 (并查集+欧拉回路 )

    题目链接 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画.   输入 第一行只有一个正整数 ...

  4. NYOJ 42 一笔画

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  5. HDOJ 1878 欧拉回路 nyoj 42一笔画问题

    #include<cstdio> #include<cstring> ]; int find(int x) { if(visited[x]!=x) return find(vi ...

  6. nyoj 42

    #include <iostream> #include <stdio.h> #include <cstring> #include <algorithm&g ...

  7. NYOJ 题目42 一笔画问题

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  8. NYOJ 题目42 一笔画问题(欧拉图)

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 zyc从小就比較喜欢玩一些小游戏.当中就包含画一笔画.他想请你帮他写一个程序.推断一个图是否可以用一笔画下 ...

  9. nyist 42 一笔画 (欧拉回路 + 并查集)

    nyoj42 分析: 若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径. 若该路径是一个圈,则称为欧拉(Euler)回路. 具有欧拉回路的图称为欧拉图(简称E图).具有欧拉路 ...

随机推荐

  1. 理解WebSocket

    WebSocket的动机是什么? 目前的Web通信使用的是HTTP协议,HTTP协议是基于TCP协议的应用层协议,HTTP协议的工作模式是request/response模式.在一次通信中,必须首先由 ...

  2. java之容器

    先来一张容器的API框架图,我们在java中所学的所有知识,都是根据下面这张图来学习的.... 容器API: 1.Collection接口------定义了存储一组对象的方法,其子接口Set和List ...

  3. win8磁盘占用100%的12种解决办法

    解决方法1:硬盘4K对齐,能减少磁盘占用100%情况.(大部分用户能解决) 解决方法2:检查硬盘AHCI驱动是否安装 解决方法3:通过 HD Tune Pro 5 专业的硬盘测试工具 检测硬盘健康度, ...

  4. 2^x mod n = 1(欧拉定理,欧拉函数,快速幂乘)

    2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  5. UIView 与 CALayer

    联系: 1. UIView 有个属性 layer,可以返回它的主 CALayer 实例:CALayer *layer = myView.layer 2. 一个 UIView 可以有多个 CALayer ...

  6. EditorWindow中手动控制焦点

    在Unity3D中制作编辑器的时候,有时候会需要手动控制界面上控件的焦点,与此相关的有三个函数都在下面的示例代码中了: public void Test() { // 给控件命名 GUI.SetNex ...

  7. UML系列03之 UML类图(二)

    概要 在"UML系列02之 UML类图(一) "中介绍了类图的基本构成--类的UML表示方法.本文是接着前文,继续对"UML的类图"中几种关系进行介绍.介绍的主 ...

  8. [Design Patterns] 2. Design principle

    Single Responsibility Principle 类的设计趋向于:Use Case Diagram --> (derived) --> Detail Open-Closed ...

  9. 剑指架构师系列-Linux下的调优

    1.I/O调优 CentOS下的iostat命令输出如下: $iostat -d -k 1 2 # 查看TPS和吞吐量 参数 -d 表示,显示设备(磁盘)使用状态:-k某些使用block为单位的列强制 ...

  10. Github教程(1)

    Git基本命令 git diff:查看工作树,暂存区,最新提交之间的差别 举例: 在README.MD中增加一行 ## This is the subtitle 执行git diff 命令,查看当前工 ...