九度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,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- windowsPhone一些不常见控件
1.InkPresenter:可以产生手写效果的控件. http://www.cnblogs.com/randylee/archive/2010/08/10/1791222.html 2.Thumb: ...
- ASP.NET MVC Controller 编程所涉及到的常用属性成员
Controller (System.Web.Mvc.Controller) 1.获取路由中的各个值 Request.RequestContext.RouteData.Values["id& ...
- SQL Server Profiler (SQl跟踪器)的简单使用
一.工具介绍 在实际开发中,我们的数据库应用系统因为不可避免会存在有大量表,视图,索引,触发器,函数,存储过程,sql语句等,所以会出现一系列问题,有问题不可怕,找对工具很重要.接下来我就介绍一款性能 ...
- java设计模式 策略
什么是策略设计模式? 世界永远都在变,唯一不变的就是变本身 举个生活中的例子,小时候玩的游戏中,Sony的PSP提供了统一的卡槽接口,玩家只要更换卡带就可以达到更换游戏的目的,做到了一机多用 特工执行 ...
- 移动端页面怎么适配ios页面
1.viewport 简单粗暴的方式:<meta name="viewport" content="width=320,maximum-scale=1.3,user ...
- kali linux之netcat
网络工具中的瑞士军刀----体积小,功能强大 侦听模式/传输模式 telnet/获取banner信息 传输文本信息,文件,目录 加密传输文件,远程控制/木马,加密所有流量(来做远程控制是非常理想的选择 ...
- jquery常用事件——幕布
jquery常用事件:https://mubu.com/doc/yIEfCgCxy0
- Xamarin Forms:小马过河,王者归来
因为我媳妇的原因,去年下半年从零开始学习Android原生开发,做了一个答题库app.整体给我的感觉是入门难度不大,前期折腾一番,大部分时间都是花在开发上面,其实任何一门语言都是如此. 今年我又有另一 ...
- POJ-1321-棋盘问题(深搜)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65409 Accepted: 31227 Descriptio ...
- C#中调用SAPI实现语音识别的2种方法
通过微软的SAPI,不仅仅可以实现语音合成TTS,同样可以实现语音识别SR.下面我们就介绍并贴出相关代码.主要有两种方式: 1.使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来 ...