NYOJ 一笔画问题(DFS+欧拉回路)
2018-03-28 16:40
405 查看
思路:笔者第一次做一笔画问题,先用的DFS+回溯,结果样例能出来。但OJ显示错误。后来查了一下发现是欧拉回路的问题。需要回顾以前离散数学学的欧拉回路了。。。。
此处欧拉通路(对于无向图)需要判断:
①(入度||出度)为奇数的顶点的个数为0||2。
②图是连通的。
原因:奇度顶点在连通图中相当于起点或者终点,所以个数只能是0个(起点即终点)或者两个(一个起点一个终点)
以下三种情况中奇度顶点个数的栗子。
#include <iostream> #include <cstring> #include <vector> using namespace std; vector<int> a[1001]; bool vis[1001],flag; int P,count; int judge(){ int tmp = 0; for(int i=1;i<=P;i++){ int cnt = a[i].size(); if(cnt%2!=0) tmp++; } return tmp; } void dfs(int cur){ if(count==P){ flag = true; return; }else for(int i=0;i<a[cur].size();i++) if(!vis[a[cur][i]]){ vis[a[cur][i]] = true; count++; dfs(a[cur][i]); if(flag) return; } } int main(){ int N,Q,A,B; cin>>N; while(N--){ cin>>P>>Q; memset(a,0,sizeof(a)); memset(vis,false,sizeof b57c (vis)); while(Q--){ cin>>A>>B; a[A].push_back(B); a[B].push_back(A); } int jiShu = judge(); if(jiShu==0||jiShu==2){ vis[1] = true; count = 1; flag = false; dfs(1); if(flag) cout<<"Yes"<<endl; else cout<<"No"<<endl; }else cout<<"No"<<endl; } return 0; }
相关文章推荐
- NYOJ - 42 - 一笔画问题(欧拉回路,DFS)
- NYOJ 42 一笔画问题(DFS||并查集+欧拉回路)
- nyoj42 一笔画问题(欧拉图、dfs)
- nyoj 42 一笔画问题《欧拉回路》
- NYOJ42 一笔画问题 【欧拉回路】+【并查集】
- NYOJ 42-一笔画问题(判断欧拉回路)
- NYOJ--42--dfs--一笔画问题
- NYoj-42-一笔画问题-DFS
- nyoj 42 一笔画问题 无向图的欧拉回路
- nyoj 42- 一笔画问题(欧拉回路)
- NYOJ—一笔画问题(欧拉回路)
- NYOJ42 一笔画问题 欧拉回路判定+前向星
- nyoj 42 一笔画问题 dfs或并查集判断连通
- HDOJ 1878 欧拉回路 nyoj 42一笔画问题
- nyoj42一笔画问题 【欧拉回路】
- NYOJ 42:一笔画问题【欧拉回路】
- nyoj42 一笔画问题 (欧拉回路)
- nyoj 42 一笔画问题(欧拉通路+dfs || 并查集)
- nyoj42 一笔画问题 并查集加欧拉回路
- NYOJ42-一笔画问题