Nyoj 42 一笔画问题
2014-04-04 08:45
281 查看
题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=42
无向图G存在欧拉通路的充要条件是:G为连通图,并且G仅有两个奇度顶点(度数为奇数的顶点),或者无奇度顶点
当然可用并查集来解,找出奇度顶点的个数,记录集合的个数,然后根据充要条件判断!
深搜:
无向图G存在欧拉通路的充要条件是:G为连通图,并且G仅有两个奇度顶点(度数为奇数的顶点),或者无奇度顶点
当然可用并查集来解,找出奇度顶点的个数,记录集合的个数,然后根据充要条件判断!
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 1010; int parent[MAXN]; int kcount[MAXN]; void Inite_Tree() { for(int i = 1; i < MAXN; ++i) { parent[i] = i; kcount[i] = 1; } return ; } /** int Find_Parent(int x)//递归求根 { if(x != parent[x]) parent[x] = Find_Parent( parent[x] ); return parent[x]; } */ int Find_Parent(int x)//非递归求根 { int s; for(s = x; s != parent[s]; s = parent[s]) ; while(x != s) { int tmp = parent[x]; parent[x] = s; x = tmp; } return s; } void Union_Set(int x, int y) { int r1 = Find_Parent( x ); int r2 = Find_Parent( y ); int tmp = kcount[r2] + kcount[r1]; if(kcount[r1] > kcount[r2]) { parent[r2] = r1; kcount[r1] = tmp; } else { parent[r1] = r2; kcount[r2] = tmp; } } int main() { int T, num, setnum; int n, m; int u, v; int degree_Of_Vertex[MAXN]; scanf("%d", &T); while(T--) { memset(degree_Of_Vertex, 0, sizeof(degree_Of_Vertex)); Inite_Tree(); scanf("%d %d", &n, &m); for(int i = 1; i <= m; ++i) { scanf("%d %d", &u, &v); degree_Of_Vertex[u]++; degree_Of_Vertex[v]++; if(Find_Parent(u) != Find_Parent(v)) Union_Set(u, v); } num = 0, setnum = 0; for(int i = 1; i <= n; ++i) { if(degree_Of_Vertex[i] % 2) num++; if(parent[i] == i) setnum++; } if((num == 0 || num == 2) && setnum == 1) printf("Yes\n"); else printf("No\n"); } return 0; }
深搜:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int MAXN = 1010; int Graph[MAXN][MAXN]; bool visit[MAXN]; int degree[MAXN]; int n; void DFS(int CurVertex) { visit[CurVertex] = true; for(int i =1; i <= n; ++i) { if(Graph[CurVertex][i]) { if(!visit[i]) DFS(i); } } } int main() { int T; int m; int u, v; scanf("%d", &T); while(T--) { memset(degree, 0, sizeof(degree)); memset(Graph, 0, sizeof(Graph)); scanf("%d %d", &n, &m); for(int i = 1; i <= m; ++i) { scanf("%d %d", &u, &v); Graph[u][v] = 1; Graph[v][u] = 1; degree[u]++; degree[v]++; } memset(visit, false, sizeof(visit)); DFS(1); int num = 0; bool flag = true; for(int i = 1; i <= n; ++i) { if(visit[i] == false) { flag = false; break; } if(degree[i] % 2) num++; } if(!flag) { printf("No\n"); continue ; } if(num == 2 || num == 0) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- NYOJ 42 一笔画问题
- 判断图的连通性+一笔画问题(NYOJ 42 一笔画问题)
- NYOJ 题目42 一笔画问题
- 并查集 深搜 nyoj 42 一笔画问题
- NYOJ - 42 - 一笔画问题(欧拉回路,DFS)
- NYOJ 42 一笔画问题 【欧拉图 + 并查集】
- NYOJ 42 一笔画问题
- nyoj--42--一笔画问题(并查集)
- nyoj 42 一笔画问题
- NYOJ42 一笔画问题(欧拉路+并查集)
- NYOJ 42—一笔画问题
- NYOJ42 一笔画问题 【欧拉回路】+【并查集】
- nyoj42 一笔画问题 搜索+欧拉图
- NYOJ-42 一笔画问题
- nyoj_42 一笔画问题
- nyoj42 一笔画问题(欧拉图、dfs)
- nyoj--42--一笔画问题(并查集)
- NYOJ 题目42 一笔画问题(欧拉路,图的连通性)
- NYOJ 42 一笔画问题
- NYoj42 一笔画问题