欧拉回路的判断
2015-08-05 18:25
211 查看
最近多校碰到几道和欧拉回路相关的题目,这里做个总结
代码:dfs 递归实现:如果是欧拉回路,则输出“1”,否则输出“0”。
代码:dfs 递归实现:如果是欧拉回路,则输出“1”,否则输出“0”。
#include <bits/stdc++.h> using namespace std; const int N=1005; int G ;///邻接矩阵存储图 int vis ;///遍历时标记该点是否被访问过 int deg ;///存储节点的度 void dfs(int v,int n){///深度优先遍历,递归 vis[v]=1; for(int i=1; i<=n; ++i){ if(G[v][i]&&!vis[i]) dfs(i,n); } } void init(){ memset(G,0,sizeof(G)); memset(vis,0,sizeof(vis)); memset(deg,0,sizeof(deg)); } int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF&&n){ init(); int flag=1; for(int i=0; i<m; ++i){ int u,v;scanf("%d %d",&u,&v); G[u][v]=G[v][u]=1;deg[u]++;deg[v]++; } dfs(1,n);///从第一个顶点搜索 for(int i=1; i<=n; ++i){ if(!vis[i]){ flag=0;///若有点未曾被访问,即一次深度遍历有未访问的点,则不存在欧拉回路 break; } if(deg[i]&1){ flag=0;///若有点的度不是偶数,则不存在欧拉回路 break; } } if(flag) puts("1"); else puts("0"); }return 0; } 并查集: #include <bits/stdc++.h> using namespace std; const int N=1005; int deg ,fa ; int t,n,m; int Find(int x){ if(x==fa[x]) return x; return fa[x]=Find(fa[x]); } void Union(int x,int y){ int fx=Find(x);int fy=Find(y); if(fx!=fy) fa[x]=fy; } bool solve(){ int cnt=0; for(int i=1; i<=n; ++i){ if(fa[i]==i) cnt++; } if(cnt!=1) return false; for(int i=1; i<=n; ++i){ if(deg[i]&1) return false; } return true; } int main() { while(scanf("%d%d",&n,&m)!=EOF&&n){ for(int i=1; i<=n; ++i) {fa[i]=i,deg[i]=0;} int u,v; for(int i=0; i<m; ++i){ scanf("%d%d",&u,&v);Union(u,v);deg[u]++;deg[v]++; } if(solve()) puts("1"); else puts("0"); } return 0; }
相关文章推荐
- 黑马程序员---OC内存管理中的MRC
- h2db函数整理
- 优秀博文
- Android利用Gson解析嵌套多层的Json
- 25个经典的Spring面试问答
- Hadoop集群(第2期)_机器信息分布表
- 管理信息系统需求调研分析指南
- 【Python】 [基础] 条件判断 与 循环 与dict和set
- @keyframes规则实现多重背景的CSS动画
- hdu 5322 Hope(分治+NTT)
- iOS Core Animation
- Hibernate缓存☞总结
- Hibernate缓存☞查询缓存
- OFDM之viterbi译码
- Java泛型
- Hadoop集群(第1期)CentOS安装配置
- zendframework form with captcha(Base on ZendFrameWork2.4)
- Hibernate缓存☞二级缓存
- Hibernate缓存☞一级缓存
- 线程(下)