标签:
zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来。
规定,所有的边都只能画一次,不能重复画。
2 4 3 1 2 1 3 1 4 4 5 1 2 2 3 1 3 1 4 3 4
No Yes
/*并查集 int par[MAX_N]; int rank[MAX_N}; //初始化n个元素 void init(int n) { for(int i=0;i<n;i++) { par[i]=i; rank[i]=0; } } //查询树的根 int find(int x) { if(par[x]==x) return x; else return par[x]=find(par[x]); } //合并x和y所属的集合 void unite (int x,int y) { x=find(x); y=find(y); if(x==y) return ; if(rank[x]<rank[y]) par[x]=y; else { par[y]=x; if(rank[x]==rank[y]) rank[x]++; } } //判断x和y是否属于同一个集合 bool same(int x,int y) { return find(x)==find (y); } */ #include <stdio.h> #include <string.h> #define MAX 1002 int degree[MAX]; int map[MAX]; void init(int n) { for(int i=0;i<=n;i++) map[i]=i; } int find(int i) { return (map[i]==i)?i:find(map[i]); } int main() { int n,k,i,j,q,a,b; int flage,cnt; scanf("%d",&k); while(k--) { scanf("%d%d",&n,&q); flage=0; memset(degree,0,sizeof(degree)); init(n); for(i=0; i<q; i++) { scanf("%d %d",&a,&b); degree[a]++; degree[b]++; map[find(a)]=map[find(b)]; } cnt=0; for(i=1;i<=n;i++) { if(map[i]==i) cnt++; if(degree[i]%2==1) flage++; } if(cnt==1&&(flage==0||flage==2)) printf("Yes\n"); else printf("No\n"); } return 0; }
标签:
原文地址:http://blog.csdn.net/qq_16997551/article/details/45224355