HDU 1878 无向图的欧拉回路的判断
来源:互联网 发布:手机淘宝怎样改好评 编辑:程序博客网 时间:2024/06/07 01:41
点击打开链接
欧拉回路
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8198 Accepted Submission(s): 2933
Problem Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
束。
Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
Sample Input
3 31 21 32 33 21 22 30
Sample Output
10
Author
ZJU
Source
浙大计算机研究生复试上机考试-2008年
欧拉回路
欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,
称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。
判断欧拉路是否存在的方法
有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。
无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。
判断欧拉回路是否存在的方法
有向图:图连通,所有的顶点出度=入度。
无向图:图连通,所有顶点都是偶数度。
用DFS来判断欧拉回路:
#include<stdio.h>#include<vector>using namespace std;int deg[1007],vis[1007];int n,m;vector<int>v[1007];void init(){ for(int i=1;i<=n;i++) { deg[i]=0; vis[i]=0; v[i].clear(); }}void dfs(int point){ vis[point]=1; for(int i=0;i<v[point].size();i++) { int next=v[point][i]; //printf("%d\n",next); if(!vis[next]) dfs(next); }}int main(){ while(scanf("%d",&n),n) { scanf("%d",&m); init(); int a,b; while(m--) { scanf("%d%d",&a,&b); v[a].push_back(b); v[b].push_back(a); deg[a]++; deg[b]++; } int flag=1; for(int i=1;i<=n;i++) if(deg[i]%2) { printf("0\n"); flag=0; break; } if(!flag)continue; dfs(1); for(int i=1;i<=n;i++) if(!vis[i]) { flag=0; break; } if(flag) printf("1\n"); else printf("0\n"); } return 0;}
用并查集来判断欧拉回路:
#include<stdio.h>using namespace std;int pre[1007],dge[1007];int n,m;void init(){ for(int i=1;i<=n;i++) { pre[i]=i; dge[i]=0; }}int find(int x){ while(x!=pre[x]) x=pre[x]; return x;}void unio(int i,int j){ /*int x=find(i); int y=find(j); if(x==y)return; pre[x]=y;*/ pre[j]=find(i);}int main(){ while(scanf("%d",&n),n) { scanf("%d",&m); init(); int a,b; while(m--) { scanf("%d%d",&a,&b); dge[a]++; dge[b]++; if(find(a)!=find(b)) unio(a,b); } int flag=0; for(int i=1;i<=n;i++) if(dge[i]%2) { printf("0\n"); flag=1; break; } if(flag)continue; int x=pre[1]; for(int i=2;i<=n;i++) if(x!=find(i)) { flag=1; break; } if(flag) printf("0\n"); else printf("1\n"); } return 0;}
- HDU 1878 无向图的欧拉回路的判断
- hdu 1878 无向图的欧拉回路
- 数据结构实验之图论八:欧拉回路 无向图的欧拉回路判断
- 杭电hdu 1878 欧拉回路 无向图
- hdu 1878 欧拉回路 无向图连通性
- hdu 1878 欧拉回路(无向图)
- 【欧拉回路(无向图判定)】hdu 1878 欧拉回路
- 无向图的欧拉回路线性时间算法
- POJ 1041 无向图的欧拉回路
- hdu 1878 欧拉回路,图的连通性判断
- HDU1878无向图判断欧拉回路
- 有向图,无向图的欧拉回路和欧拉通路poj 2337
- HDU NO.1878 欧拉回路(邻接矩阵,判断欧拉回路的条件)
- HDU 1878-欧拉回路(简单的欧拉回路判断)
- HDOJ 1878 - 欧拉回路 判断无向图是否是欧拉图...
- 无向图的欧拉回路和欧拉通路
- 无向图中欧拉回路的求法 poj1041
- ccf+欧拉回路和dfs判断无向图的连通性+这里知道了bool标记visit以及vector和前向星存图
- 【树形DP】 HDU 4616 Game
- QT blog
- SQLite数据库查询优化
- sfl4j+logback取代log4j 、jcl
- ZOJ 2972 (DP)
- HDU 1878 无向图的欧拉回路的判断
- HDU 1391
- JSP运行原理(一)
- 开发者必备的6款源码搜索引擎
- 大小写互换
- 关于丁克的问题
- 开通博客
- why total memory is less than atual memory in /proc/meminfo,
- android 签名对比