NYOJ-42 一笔画问题

解题思路:1 如果图中所有的点连通且度都为偶数则可以一笔画成。

              2 如果图中有不超过2个点的度为奇数则可以一笔画。

              3做法显然先通DFS判断图是否连通过,然后在判断图中奇数点度的个数即可。

             

View Code
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #define N 1010
 6 
 7 using namespace std;
 8 
 9 int G[N][N], vis[N], num[N];
10 int P, Q, ok;
11 void dfs(int u)
12 {
13    int v;
14    vis[u] = 1;
15    for(v=1; v<=P; v++)
16    {
17      if(G[u][v] && !vis[v] && u!=v)
18      { 
19          dfs(v); 
20      }   
21    }
22 }   
23 
24 int main()
25 {
26    int i,ncases,count,a,b;
27    
28    scanf("%d",&ncases);
29    while( ncases-- )
30    {
31       scanf("%d%d",&P,&Q);
32       memset(G,0,sizeof(G)); 
33       memset(num,0,sizeof(num));
34       memset(vis,0,sizeof(vis));  
35       for(i=1; i<=P; i++)
36         G[i][i] = 1;   
37       for(i=1; i<=Q; i++)
38       {
39          scanf("%d%d",&a,&b);      
40          G[a][b] = G[b][a] = 1; 
41          num[a]++;  num[b]++;     
42       }
43       ok = 1; 
44       count = 0;  
45       dfs(1); 
46       for(i=1; i<=P; i++)
47       {
48          if(!vis[i])
49          { 
50             ok = 0;
51             printf("No\n");
52             break;
53          }
54       }
55       for(i=1; i<=P; i++)
56       {
57          if(num[i]%2!=0)
58          {           
59             count++; 
60          }
61       }            
62       if(ok)
63       {
64         if(count==0 || count==2)
65            printf("Yes\n");
66         else  
67            printf("No\n");  
68       }                  
69     }        
70    return 0; 
71 }

 

 

posted @ 2012-04-25 22:25  zhongya  阅读(178)  评论(0编辑  收藏  举报