nyoj42一笔画问题
2016-09-11 21:53
218 查看
一笔画问题比较的清晰,学过图论的都知道欧拉回路是经过每一条边只一次能够经过全部的点。
判断能否一笔画只需要两点符合就行了,一是通路,可以用并查集判断;二是节点为奇数的点的个数为0或者是2,。满足上面的两点就可以判断是否是一笔画图。
并查集不用多说,都有模板,判断点的地方可以在输入的时候建立数组保存下来节点个数就可以了。
判断能否一笔画只需要两点符合就行了,一是通路,可以用并查集判断;二是节点为奇数的点的个数为0或者是2,。满足上面的两点就可以判断是否是一笔画图。
并查集不用多说,都有模板,判断点的地方可以在输入的时候建立数组保存下来节点个数就可以了。
#include <iostream> #include <stdio.h> #include <string.h> #include <queue> using namespace std; int n,m; int father[2010]; int num[2010]; void makeSet(int n){ for(int i=0;i<=n;i++) father[i] = i; } int Find_Root(int x){ int tempRoot; int root = x; while(root != father[root]) root = father[root]; while(x != root){ tempRoot = father[x]; father[x] = root; x = tempRoot; } return root; } void Union(int x,int y){ int xroot = Find_Root(x); int yroot = Find_Root(y); if(xroot != yroot){ father[xroot] = yroot; } } int main() { int T; cin >>T; while(T--){ memset(num,0,sizeof(num)); int flag=1,cnt=0; cin >>n>>m; makeSet(n); for(int i=1;i<=m;i++){ int a,b; cin >>a>>b; num[a]++; num[b]++; Union(a,b); Union(b,a); } for(int i=1;i<=n;i++){ if(Find_Root(i)!=Find_Root(1)) flag=0; if(num[i]%2==1) cnt++; } if(flag==0) cout <<"No"<<endl; else{ if(cnt==0||cnt==2) cout <<"Yes"<<endl; else cout <<"No"<<endl; } } return 0; }
相关文章推荐
- NYOJ 42一笔画问题||欧拉图
- NYOJ 42一笔画问题
- HDOJ 1878 欧拉回路 nyoj 42一笔画问题
- nyoj42一笔画问题(欧拉图)
- nyoj42一笔画问题 【欧拉回路】
- NYOJ42一笔画问题
- nyoj42一笔画问题(欧拉图)
- nyoj 42一笔画问题
- nyoj42一笔画问题
- nyoj42一笔画问题
- nyoj-----42一笔画问题
- nyoj42一笔画问题
- NYOJ--42一笔画问题【并查集】
- nyoj42一笔画问题欧拉图
- NYOJ42一笔画问题
- NYOJ42 一笔画问题
- NYOJ-42-一笔画问题(搜索)
- NYOJ 42 一笔画问题
- NYOJ 42 一笔画问题 http://acm.nyist.net/JudgeOnline/problem.php?pid=42
- NYOJ 42 一笔画问题