一笔画问题
时间限制:
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<iostream> #include<cstring> using namespace std; int degree[1010],head[1010],edge[4010][2],vis[1010],n,m,cnt; void create() { int num=0; for(int i=0;i<m;i++) { int from,to; cin>>from>>to; degree[from]++; degree[to]++; edge[num][0]=to; edge[num][1]=head[from]; head[from]=num++; edge[num][0]=from; edge[num][1]=head[to]; head[to]=num++; } } void dfs(int begin) { vis[begin]=1; for(int t=head[begin];t!=-1;t=edge[t][1]) if(!vis[edge[t][0]]) cnt++,dfs(edge[t][0]); } int main() { int T; cin>>T; while(T--) { int c=0,i; cnt=0; cin>>n>>m; memset(vis,0,sizeof(vis)); memset(head,-1,sizeof(head)); memset(degree,0,sizeof(degree)); create(); dfs(1); if(cnt==n-1) { for( i=1;i<=n;i++) if(degree[i]%2) c++; if(c==0||c==2) cout<<"Yes"<<endl; else cout<<"No"<<endl; } else cout<<"No"<<endl; } return 0; }
-
第一行只有一个正整数N(N<=10)表示测试数据的组数。