NYOJ-42 一笔画问题
2012-06-04 12:33
302 查看
一笔画问题
时间限制: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"。样例输入
样例输出
代码一:------DFS
代码二:-------并查集
时间限制: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<stdio.h> #include<string.h> int p[1005],visit[1005],G[1005][1005]; int point,line; void DFS(int i) { int v=i; visit[i]=1; for(v=0;v<point;++v) { if(v!=i&&G[i][v]&&!visit[v]) DFS(v); } } int main() { int n,i,x,y,count,flag; scanf("%d",&n); while(n--) { count=0; flag=1; scanf("%d%d",&point,&line); memset(p,0,sizeof(p));//统计各节点的度 memset(visit,0,sizeof(visit));//访问标记数组 memset(G,0,sizeof(G));//邻接矩阵 for(i=0;i<line;++i) { scanf("%d%d",&x,&y); G[x-1][y-1]=G[y-1][x-1]=1; ++p[x-1]; ++p[y-1]; } DFS(0);//判断是否连通 for(i=0;i<point;++i) { G[i][i]=1; if(visit[i]==0) flag=0; if(p[i]&1) ++count; } if(flag)//说明是连通图 { if(count==2||count==0) printf("Yes\n"); else printf("No\n"); } else printf("No\n"); } return 0; }
代码二:-------并查集
#include <cstdio> #include <iostream> #include <cstring> using namespace std; int father[1005], deg[1005]; int find(int k) { if(k == father[k]) return k; else return father[k] = find(father[k]); } int main() { int T, p, q, a, b; scanf("%d", &T); while(T--) { scanf("%d%d", &p, &q); for(int i = 1; i <= p; ++i) { father[i] = i; deg[i] = 0; } while(q--) { scanf("%d%d", &a, &b); ++deg[a]; ++deg[b]; int fa = find(a); int fb = find(b); if(fa != fb) father[fa] = fb; } int cnt1, cnt2; cnt1 = cnt2 = 0; for(int i = 1; i <= p; ++i) { if(father[i] == i) { ++cnt1; if(cnt1 > 1) break; } if(deg[i] & 1) ++cnt2; } if(cnt1 > 1) printf("No\n"); else { if(cnt2 == 0 || cnt2 == 2) printf("Yes\n"); else printf("No\n"); } } return 0; }
相关文章推荐
- nyoj42 一笔画问题 (欧拉回路)
- NYOJ 42 一笔画问题
- 判断图的连通性+一笔画问题(NYOJ 42 一笔画问题)
- NYOJ-42 一笔画问题
- nyoj 42 一笔画问题
- NYOJ 42 一笔画问题 【欧拉图 + 并查集】
- nyoj 42 一笔画问题
- nyoj_42 一笔画问题
- nyoj_42 一笔画问题
- nyoj 42 一笔画问题 dfs或并查集判断连通
- NYOJ 题目42 一笔画问题(欧拉路,图的连通性)
- NYOJ 42 一笔画问题
- nyoj42 一笔画问题
- NYOJ42 一笔画问题 【欧拉回路】+【并查集】
- NYOJ 42--一笔画问题【水题 && 欧拉路】
- NYOJ 42 一笔画问题
- nyoj 42 一笔画问题
- NYOJ 题目42 一笔画问题
- 并查集 深搜 nyoj 42 一笔画问题
- NYOJ 42 一笔画问题