HDU 1878 无向图的欧拉回路的判断
2013-08-19 10:57
405 查看
点击打开链接
Total Submission(s): 8198 Accepted Submission(s): 2933
[/b]
[align=left]Problem Description[/align]
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
[align=left]Input[/align]
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
[align=left]Output[/align]
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
[align=left]Sample Input[/align]
3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
[align=left]Sample Output[/align]
1
0
[align=left]Author[/align]
ZJU
[align=left]Source[/align]
浙大计算机研究生复试上机考试-2008年
欧拉回路
欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,
称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。
判断欧拉路是否存在的方法
有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。
无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。
判断欧拉回路是否存在的方法
有向图:图连通,所有的顶点出度=入度。
无向图:图连通,所有顶点都是偶数度。
用DFS来判断欧拉回路:
[b]用并查集来判断欧拉回路:
欧拉回路
[b]Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8198 Accepted Submission(s): 2933
[/b]
[align=left]Problem Description[/align]
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
[align=left]Input[/align]
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
[align=left]Output[/align]
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
[align=left]Sample Input[/align]
3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
[align=left]Sample Output[/align]
1
0
[align=left]Author[/align]
ZJU
[align=left]Source[/align]
浙大计算机研究生复试上机考试-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.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; }
[b]用并查集来判断欧拉回路:
#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 欧拉回路
- hdu1878—欧拉回路(欧拉回路判断)
- hdu 1878 欧拉回路(水题,判断欧拉回路)
- HDU 1878(1Y) (判断欧拉回路是否存在 奇点个数为0 + 一个联通分量 *【模板】)
- hdu 1878 欧拉回路,图的连通性判断
- Hdu 1878 欧拉回路[判断是否存在欧拉回路]
- HDU 1878 欧拉回路(判断欧拉回路)
- hdu 1878 欧拉回路,图的连通性判断
- HDU1878--欧拉回路(并查集+欧拉回路)
- hdu 1878 欧拉回路 无向图连通性
- hdu 1878 欧拉回路
- HDU 1878 欧拉回路
- HDU 1878 欧拉回路
- HDU 1878 欧拉回路
- HDU-1878 欧拉回路
- HDU1878-欧拉回路(入门题+并查集)
- HDU - 1878 欧拉回路
- HDU --- 1878 【欧拉回路】以及基本欧拉回路的知识