NYOJ-42 一笔画问题
解题思路:1 如果图中所有的点连通且度都为偶数则可以一笔画成。
2 如果图中有不超过2个点的度为奇数则可以一笔画。
3做法显然先通DFS判断图是否连通过,然后在判断图中奇数点度的个数即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }