九度oj题目1027:欧拉回路
题目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
注意:代码中的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:欧拉回路的更多相关文章
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
- 九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
- 九度OJ题目1003:A+B
while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- duilib入门简明教程 -- VS环境配置(2)
会SVN和配置VS环境的请跳过此篇~ 既然是入门教程,那当然得基础点,因为搜索duilib相关资料时,发现有些小伙伴到处都是编译错误,以及路径配置错误等等,还有人不知道SVN ...
- android studio中使用recyclerview小白篇(三)
继续接着昨天的来,昨天终于弄好了一个例子,但是那个没有点击事件, 需要自己添加,参照别人的例子,弄了个比较简单的,主要是改动myRecycleradatper.java中的部分. 增加如下的接口: / ...
- MongoDB单表导出与导入
mongoexport -h -u dbAdmin -p L-$LpGQ=FJvSf*****([l --authenticationDatabase=project_core_db -d proje ...
- vs 2017局域网内调试
之前调试代码都是在本地启动服务,以 localhost:端口号 的形式调试,今天发现也是可以用ip地址的形式来调用接口,这种方式可以支持内网内Client端调用接口,实现调试的功能,具体方法如下 ...
- git you need to resolve your current index first 解决办法
当使用git checkout 切换分支时会提示you need to resolve your current index first,使用如下命令即可解决. $ git reset --merge
- jenkins html报告不显示样式
解决办法: 1.安装Startup Trigger,在jenkins节点启动时触发构建: 2.安装Groovy,直接运行Groovy代码: 3.新建一个Job,用于jenkins启动时执行配置命令: ...
- 深入 Nginx:我们是如何为性能和规模做设计的
NGINX 在网络应用中表现超群,在于其独特的设计.许多网络或应用服务器大都是基于线程或者进程的简单框架,NGINX突出的地方就在于其成熟的事件驱动框架,它能应对现代硬件上成千上万的并发连接. NGI ...
- winform程序使用clickonce方式发布之后点击安装没反应
可能是少了index.html和web.config两个文件,这两个文件为什么没有在发布的时候生成,还有怎么影响安装的后续研究
- mybatis 学习笔记(一):mybatis 初认识
mybatis 学习笔记(一):mybatis 初认识 简介 MyBatis是一个Java持久层框架,它通过XML描述符或注解把对象与存储过程或SQL语句关联起来.mybatis 可以将 prepar ...
- 【BlockingQueue】BlockingQueue 阻塞队列实现
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便 ...