一笔画问题

来源:互联网 发布:php调用微信支付接口 编辑:程序博客网 时间:2024/04/30 00:16
描述zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。规定,所有的边都只能画一次,不能重复画。输入第一行只有一个正整数N(N<=10)表示测试数据的组数。每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线。(点的编号从1到P)随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线。输出如果存在符合条件的连线,则输出"Yes",如果不存在符合条件的连线,输出"No"。样例输入24 31 21 31 44 51 22 31 31 43 4样例输出NoYes/*      题解 :  首先要判断给出的连线是否是一个整体,如果不是一个整体,就直接输出“No”,否则就判断是否是欧拉回路,如果是欧拉回路,输出“Yes”, 否则输出“No”.*///标程:#include<iostream>#include<cstdio>#include<cstring>using namespace std;int father[2010], r[2010];int find(int x){if(x != father[x])                   {          father[x]=find(father[x]);            }      return father[x];  }void combine(int x,int y){    x = find(x);                                 y = find(y);      if(x == y) return ;      if(r[x] > r[y])      {          father[y]=x;                             r[x]++;      }      else      {          if(r[x] == r[y])   r[y] ++;          father[x]=y;      }  }int main(){// freopen("a.txt","r",stdin);    int a[2010], i, t;cin >> t;while(t --){int n, m;cin >> n >> m;int u, v;for(i = 1; i <= n; ++ i){father[i] = i;r[i] = 0;}memset(a,0,sizeof(a));        for(i = 1; i <= m; i ++){cin >> u >> v;a[u] ++;a[v] ++;u = find(u);v = find(v);if(u != v)  combine(u,v);}int cnt(0), cnt1(0);for(i = 1; i <= n; i ++){if(a[i] % 2 == 1)  ++ cnt;if(find(i) == i) ++ cnt1;}if((cnt == 2 || cnt == 0) && cnt1 == 1) cout << "Yes" << endl;else cout << "No" << endl;}return 0;}

0 0