一笔画问题

时间限制: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
来源
[张云聪]原创
上传者
张云聪
//判断节点的度来判断图的连通, 感觉这个题判题不严格。
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 
 7 const int INF = 0x3f3f3f3f;
 8 int father[1010], degree[1010], vis[1010];
 9 int i, j, n, flag;
10 
11 void init()
12 {
13     memset(vis, 0, sizeof(vis));
14     memset(degree, 0, sizeof(degree));
15     for(i=1; i<=n; i++)
16     father[i] = i;
17 }
18 
19 int find(int a)
20 {
21     while(a != father[a])
22     a = father[a];
23     return a;
24 }
25 
26 void mercy(int a, int b)
27 {
28     int q = find(a);
29     int p = find(b);
30     if(q != p)
31     father[q] = p;
32 }
33 
34 int main()
35 {
36     int m, t;
37     scanf("%d", &t);
38     while(t--)
39     {
40         scanf("%d %d", &n, &m);
41         init();
42         for(i=0; i<m; i++)
43         {
44             int a, b;
45             scanf("%d %d", &a, &b);
46             if(a == b) continue;  
47             mercy(a, b);    //自己到自己,   
48             degree[a]++; degree[b]++;
49             vis[a] = vis[b] = 1;
50         }
51         int total = 0, sum = 0;
52         for(i=1; i<=n; i++)
53         {
54             if(vis[i] && father[i] == i)
55             total++;
56             if(degree[i] % 2 == 1)
57             sum++;
58         }
59         if((sum == 2 || sum==0 ) &&total == 1)
60         printf("Yes\n");
61         else
62         printf("No\n");
63     }
64     return 0;
65 }

 

//It's bad. ~ !

posted on 2015-07-30 14:18  cleverbiger  阅读(219)  评论(0)    收藏  举报