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 - 来源
- [张云聪]原创
做这道题之前,我们先引入一个列题........
|
在18世纪的哥尼斯堡城里有七座桥。当时 有很多人想要一次走遍七座桥,并且每座桥只能经过一次。这就是世界上很有名的哥尼斯堡七桥问题。你能一次走遍这七座桥,而又不重复吗?(自己动手画画吧)
答案
16.一笔画问题 这个问题,实际上是一笔画问题。 一笔画就是一笔可以画成一个图。 判断一笔画的方法: ①是连通的。一个图,如果图上任意二点总有线段连接着,就称为连通的。不是连通的就不能一笔画出。 ②奇点个数是0或者是2。图上线段的端点可以分成二类,奇点和偶数。一个点,以它为端点的线段数是奇数就称为奇点,线段数是偶数就称为偶点。 一个图是否是一笔画就看奇点的个数,奇点个数是 0 或者 2,就是一笔画,否则就不是一笔画。 哥尼斯桥问题,就是一笔画问题。但因A、B、C、D四个点都是奇点即奇点的个数是4,而不是0或2,所以不是一笔画,也就不能一次走遍,而又不重复。 |
针对这么个情况,所谓的连通图:
若无向图G是平凡图或者G中任意两点都是连通的,则称G是连通图,否则称G是非连通图。
关于弱连通图和强连通图:
弱连通图的概念是:如果略去D中各有向边的方向后所得无向图是连通图,则称D是弱连通图。
反之 若D中任何一对顶点都是互相可达的,则称D是强连通图。
所以这个问题完全可以转化策略为:
第一步: 首先我们不管它三七二十几,先进行连通性的判断。
第二步:
(1)如果是连通的,我们来判断此图的度的奇点的个数是0或者是2 ,如果是,则说明这个是欧拉图,即可以一笔画出,反之则不能一笔画出
(2)如果是非连通的,这说明这个图很定不能一笔画出。
代码为:
采用dfs算法求解:
/*nyoj 42 coder Gxjun*/
/*一笔画问题*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 1005
int edge[maxn]; //度
bool vis[maxn],map[maxn][maxn];
int pp , qq ;
void dfs( int pos )
{
vis[pos]=true;
for( int i=;i<=pp;i++)
if(!vis[i]&&map[pos][i])
dfs(i);
} int main()
{
int test ,i,j;
int x,y;
bool flag;
//freopen("test.in","r",stdin);
scanf("%d",&test);
while(test--){
memset(edge,,sizeof(edge));
memset(map,,sizeof(map));
memset(vis,,sizeof(vis));
scanf("%d%d",&pp,&qq);
for(i=;i<qq;i++){
scanf("%d%d",&x,&y);
map[y][x]=map[x][y]=;
edge[x]++;
edge[y]++;
}
dfs();
flag=true;
for(i=;i<=pp ;i++){
if(!vis[i]){
flag=false;
break;
}
}
if(flag)
{
int ans=;
for(i=;i<=pp;i++)
if(edge[i]&) ans++;
if( ans==||ans== )
puts("Yes");
else
puts("No");
}
else
puts("No");
}
return ;
}
采用并查集求解
代码:
/*并查集 @coder Gxjun*/
/*一笔画问题*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define maxn 1001
int rank[maxn],father[maxn];
int edge[maxn];
int pp,qq;
void init(){
for(int i=;i<=pp;i++){
father[i]=i;
rank[i]=;
}
}
int set_find(int a){ while(a!=father[a])
a=father[a];
return a;
}
//带状态压缩的并查集
void set_union(int x,int y){
int a = set_find(x);
int b = set_find(y);
if(a!=b){
if(rank[a]>rank[b]){
father[b]=father[a];
rank[a]+=rank[b];
}
else{
father[a]=father[b];
rank[b]+=rank[a];
}
}
} int main()
{
int test,i,j,x,y;
//freopen("test.in","r",stdin);
scanf("%d",&test);
while(test--){
scanf("%d%d",&pp,&qq);
memset(edge,,sizeof(edge));
init();
for(i=;i<qq;i++){
scanf("%d%d",&x,&y);
set_union(x,y);
++edge[x];
++edge[y];
}
for(i=;i<=pp;i++)
if(rank[i]==pp) break;
if(i<=pp)
{
int ans=;
for(j=;j<=pp;j++)
if(edge[j]&)ans++;
if(ans==||ans==) puts("Yes");
else puts("No");
}
else puts("No");
}
return ;
}
nyoj-----42一笔画问题的更多相关文章
- nyoj 42 一笔画 欧拉通路
http://acm.nyist.net/JudgeOnline/problem.php?pid=42 一笔画问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 zyc ...
- NYOJ 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图).具有欧拉路 ...
随机推荐
- CodeForces 131A cAPS lOCK
cAPS lOCK Time Limit:500MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit St ...
- 【转载】COM的多线程模型
原文:COM的多线程模型 COM的多线程模型是COM技术里头最难以理解的部分之一,很多书都有涉及但是都没有很好的讲清楚.很多新人都会在这里觉得很迷惑,google大神能搜到一篇vckbase上的文章, ...
- Bug2算法的实现(RobotBASIC环境中仿真)
移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...
- [SAP ABAP开发技术总结]EXIT-COMMAND
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Apache-Shiro+Zookeeper系统集群安全解决方案之缓存管理
上篇[Apache-Shiro+Zookeeper系统集群安全解决方案之会话管理],解决了Shiro在系统集群开发时安全的会话共享问题,系统在使用过程中会有大量的权限检查和用户身份检验动作,为了不频繁 ...
- 没有Path的Binding
当Binding源本身就是数据且不需要Path来指明时,可以设置Path的值为".",或直接省略Path.XAML中这个"."可以省略不写,但在C#代码中是不能 ...
- C#正则表达式编程(四):正则表达式
正则表达式提供了功能强大.灵活而又高效的方法来处理文本.正则表达式的全面模式匹配表示法使您可以快速分析大量文本以找到特定的字符模式:提取.编辑.替换或删除文本子字符串:或将提取的字符串添加到集合以生成 ...
- 防止SQL注入问题
-----解决方案--------------------------------------------------------过滤URL中的一些特殊字符,动态SQL语句使用PrepareState ...
- Jquery基本、层次选择器
基本选择器: $("#none").css("background","#bbffaa"); 改变id为none的所有元素的背景色 $(&q ...
- iOS - Swift NSKeyedArchiver 数据归档
前言 public class NSKeyedArchiver : NSCoder public class NSKeyedUnarchiver : NSCoder 在 OC 语言中,归档是一个过程, ...
