一笔画问题 南阳acm42(貌似没用到什么算法)

时间:2024-01-22 08:39:59

一笔画问题

时间限制: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
来源
[张云聪]原创
上传者
张云聪
算法思想:刚看到这道题的时候就觉得可能会用到数据结构中的图或者深搜来做,但是想了一会发现不会。然后就按照自己的想法写,结果Accept了(哈哈哈)。我先把第一个点的左右赋值给l = s[0].x, r = s[0].y,然后向下面循环,找到等于l 或者 r 的数,然后重新赋值,一直这样直到每个点的经过(用k来计数,当k=0时,全部的点都经过了),具体看代码实现。
代码:
 #include<stdio.h>
#include<string.h>
struct node
{
int x,y;
}s[];
int main()
{
int i,n,p,q,l,r,k;
scanf("%d",&n);
while(n--){
memset(s,,sizeof(s));
scanf("%d%d",&p,&q);
for(i=; i<q; i++)
scanf("%d%d",&s[i].x,&s[i].y);
l = s[].x, r = s[].y, k = q-;
for(i=; i<q; i++){
if(l==s[i].x || l==s[i].y){
if(l==s[i].x) { l = -, r = s[i].y; } //当 l 等于下面的数时,说明这两个点通,然后重新赋值,l = -1,说明不要它了
else { l = -, r = s[i].x; }
s[i].x = , s[i].y = , i = , k--; //s[i].x = 0, s[i].y = 0,说也不要他们了,下面的 r 也一样。
continue;
}
if(r==s[i].x || r==s[i].y){
if(r==s[i].x) { r = -, l = s[i].y; }
else { r = -, l = s[i].x; }
s[i].x = , s[i].y = , i = , k--;
continue;
}
}
if(k == ) printf("Yes\n");
else printf("No\n");
}
return ;
}