题目1027:欧拉回路

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:2844

解决:1432

题目描述:
    欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
输入:
    测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。
输出:
    每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
样例输入:
3 3
1 2
1 3
2 3
3 2
1 2
2 3
0
样例输出:
1
0
来源:
2008年浙江大学计算机及软件工程研究生机试真题

注意:代码中的i要从1开始,要与题目匹配!!

欧拉回路定义:

若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径。若该路径是一个圈(首尾相连),则称为欧拉(Euler)回路。

判断是否存在欧拉回路的准则:

有向图:图连通,所有的顶点出度=入度。

无向图:图连通,所有顶点都是偶数度。

程序实现一般是如下过程:

1.利用并查集判断图是否连通,即判断p[i] < 0的个数,如果大于1,说明不连通。

2.根据出度入度个数,判断是否满足要求。

3.利用dfs输出路径。

学习代码:

 /***************************************************

 题目描述:
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路? 输入:
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。 输出:
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。 样例输入: 3 3
1 2
1 3
2 3
3 2
1 2
2 3
0 样例输出: 1
0 **************************************************/
#include <cstdio>
#include <cstring> using namespace std; const int N = + ; int n, m;
int g[N][N];
int degree[N];
int p[N]; int union_find(int x);
void disjoint_union(int a, int b);
bool check(); int main()
{
#ifndef ONLINE_JUDGE
freopen("e:\\uva_in.txt", "r", stdin);
#endif // ONLINE_JUDGE while (scanf("%d", &n) == )
{
if (n == )
break; scanf("%d", &m);
memset(degree, , sizeof(degree));
memset(p, -, sizeof(p)); for (int i = ; i < m; i++) {
int a, b;
scanf("%d%d", &a, &b);
degree[a]++;
degree[b]++;
disjoint_union(a, b);
} if (check())
printf("1\n");
else
printf("0\n");
}
return ;
} int union_find(int x)
{
if (p[x] < )
return x; return p[x] = union_find(p[x]);
} void disjoint_union(int a, int b)
{
int pa = union_find(a);
int pb = union_find(b); if (pa == pb)
return; if (pa < pb)
p[pb] = pa;
else
p[pa] = pb;
} bool check()
{
int cnt = ;
for (int i = ; i <= n; i++) {
cnt += (p[i] < );
if (degree[i] & )
return false;
} if (cnt != )
return false; return true;
}

自己的代码:

 #include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <stack>
#include <iostream>
using namespace std;
int fa[],degree[];
int findfa(int a){
if(fa[a]!=a){
fa[a]=findfa(fa[a]);
}
return fa[a];
}
int main(){
//freopen("D:\\INPUT.txt","r",stdin);
int n,m;
while(scanf("%d",&n)!=EOF){
if(!n){
break;
}
memset(degree,,sizeof(degree));
scanf("%d",&m);
int i;
for(i=;i<=n;i++){
fa[i]=i;
}
int u,v;
for(i=;i<m;i++){
scanf("%d %d",&u,&v);
degree[u]++;
degree[v]++;
int fu=findfa(u);
int fv=findfa(v);
if(fu>fv){
fa[fv]=fu;
}
else{
fa[fu]=fv;
}
}
int num=;
for(i=;i<=n;i++){
if(fa[i]==i){
num++;
}
}
if(num!=){//整体不联通,整个图不止一个集合.好好体会!!
cout<<<<endl;
continue;
}
int odd=;
for(i=;i<=n;i++){
if(degree[i]%){
odd++;
}
}
if(odd){//不是所有点的度数均为偶数
cout<<<<endl;
continue;
}
//全图联通并且所有点的度数均为偶数
cout<<<<endl;
}
return ;
}

九度oj题目1027:欧拉回路的更多相关文章

  1. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  2. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  4. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  5. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  6. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  7. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  8. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

  9. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

随机推荐

  1. laravel中chunk方法使用外部变量以及改变该变量

  2. python merge、concat合并数据集

    数据规整化:合并.清理.过滤 pandas和python标准库提供了一整套高级.灵活的.高效的核心函数和算法将数据规整化为你想要的形式! 本篇博客主要介绍: 合并数据集:.merge()..conca ...

  3. SHTSC2017酱油记

    考完回来累成狗..睡了一觉..补游记.. DAY0 把最近刷的题发了下题解..NOIP RK10的蒟蒻收拾收拾准备退役了.. 12点就睡了..很久周五没这么早睡了.. DAY1 9点就醒了..莫名紧张 ...

  4. 在一个java类里,private int a; 什么时候要使用integer

    private Integer index; if(index == null) index = 0; else this.index = index; Integer有一个明显的好处,就是它能比in ...

  5. 洛谷 P2330 [SCOI2005]繁忙的都市(最小生成树)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P2330 这道题的问法也实在是太模板了吧: 1.改造的道路越少越好 2.能够把所有的交叉路口直接或间接 ...

  6. CentOS 中安装nginx

    Centos6.8 yum  安装 nginx  1:使用yum安装nginx,安装nginx库 [root@hadoop110 //]# rpm -Uvh http://nginx.org/pack ...

  7. mysql ibdata 单独存储

    简介ibdata1 ibdata1文件是InnoDB存储引擎的共享表空间文件,存放位置my.ini 中的 datadir="D:\phpStudy\MySQL\data",目录下. ...

  8. python 的内置模块 re

    在 pattern 的 “” 前面需要加上一个 r 用来表示这是正则表达式, 而不是普通字符串 >>> import re >>> ptn = r"r[a ...

  9. C++_代码重用3-私有继承

    使用包含:易于理解,类声明中包含表示被包含类的显式命名对象,代码可以通过名称引用这些对象: 使用继承:将使关系更抽象,且继承会引起很多问题,尤其是从多个基类继承时. 私有继承所提供的特性确实比包含多. ...

  10. HihoCoder - 1142 三分法练手

    中文题面,原函数为三峰函数,先折半再三分 #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+11; con ...