NYOJ 42--一笔画问题【水题 && 欧拉路】
2015-11-22 17:38
281 查看
一笔画问题
时间限制: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
解析:水题,dfs判断连通,在判断是否是欧拉路即可。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define maxn 1100 int map[maxn][maxn]; int vis[maxn]; int du[maxn]; int n, m; void getmap(){ memset(vis, 0, sizeof(vis)); memset(map, 0, sizeof(map)); memset(du, 0, sizeof(du)); scanf("%d%d", &n, &m); int a, b; while(m--){ scanf("%d%d", &a, &b); du[a]++, du[b]++; map[a][b] = map[b][a] = 1; } } void dfs(int st){ vis[st] = 1; for(int i = 1; i <= n; ++i){ if(st != i && !vis[i] && map[st][i]) dfs(i); } } int main (){ int T; scanf("%d", &T); while(T--){ getmap(); dfs(1); int flag = 0; int ans = 0; for(int i = 1; i <= n; ++i){ if(!vis[i]) flag = 1; // 未连通 if(du[i] % 2 == 1) ans++; } if(!(ans == 0 || ans == 2)) flag = 1; if(!flag) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- 利用firebug调试控件样式
- connection error(usb://usb):gdi-err0r[40201]:cannot access configuration database
- 内核并发管理---spin lock
- sympy —— Python 符号运算
- 成员变量的隐藏和方法重写
- debug和release版本dll混用导致的问题
- Java多线程:线程状态
- hdu--1754
- RedHat&CentOS 6.4安装谷歌浏览器chrome
- 在STVD下配置使用CXSTM8的方式
- 三进制状压 HDOJ 3001 Travelling
- Java socket编程--TCP UDP
- 王学岗属性动画上(八)--不适用动画监听,动画先后执行
- java问题:什么是线程组
- 跟我一起写 Makefile(第一部分)
- HDU 5570 balls
- 视图控制器中之间切换的几种方式 by 李梦珂
- 1017. Queueing at Bank
- 【poj2039】To and Fro
- 断点续传的原理剖析与实例讲解