欧拉回路

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13320    Accepted Submission(s): 4972

Problem Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。
Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
Sample Input
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
Sample Output
1 0
Author
ZJU
Source
浙大计算机研究生复试上机考试-2008年
假设5 个顶点,10条边

起始顶点             1           2            3          4           5

起始父节点         1           2            3          4           5

1---2

1---3

1---4

1---5

2---3

2---4

3---5

4---5

1.并查集

若为欧拉图,相当于图中所有顶点都相连(类比最小生成树),所以除了根节点以外,每个顶点都指向其他顶点(最终都指向跟节点)

欧拉图顶点        1                           2                         3                 4                   5

父节点             2(!1)            3(!2)               4(!3)              5(!4)               5

这里假设顶点6是根节点

判断一个图是否为欧拉回路充要条件是 判断图中所有顶点的度是否都为偶数,还需判断是否为联通图。 判断联通图方法为并查集,这里使用最简单的并查集

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
using namespace std;
#define INF 0x3f3f3f3f
const int MaxV = 1005;
int degree[MaxV],fa[MaxV];//分别表示顶点的度数和顶点的父节点,就是指向该点的顶点
int N,M;
int find(int x)//获取根节点
{return fa[x]==x?x:find(fa[x]);
}
int main(){while(scanf("%d",&N)){if(N==0)break;scanf("%d",&M);memset(degree,0,sizeof(degree));//初始所有节点的度为0for(int i = 1 ; i <= N; i++)fa[i] = i ;                 //所有结点的父节点都是自身for(int i = 0 ; i < M ; i ++){int u,v;scanf("%d%d",&u,&v);degree[u]++;                 //无向图,出度+1degree[v]++;                   //入度+1int x = find(fa[u]);int y = find(fa[v]);if(x!=y) //判断输入的两个顶点是否属于同一个树,即是否联通fa[x]=y;       //如果不联通,将其联通}bool t1=false,t2=true ;int cnt = 0 ;for(int i = 1 ; i <= N ; i++){if(fa[i] == i )     //判断所有顶点是否联通,若联通说明每个顶点的父节点都为某个顶点cnt++;        //也就是说所有顶点中只有一个顶点与父节点相同if(degree[i]&1){    //判断每个顶点的度数是否为奇数,一旦是,则证明不是欧拉图t2 = false ;break;}}if (cnt == 1)t1= true;if(t1 && t2 )printf("1\n");//两个条件同时成立说明为欧拉图else printf("0\n");}return 0;
}

2 .dfs

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cstdio>
using namespace std;
#define INF 0x3f3f3f3f
const int MaxV = 1005;
int vis[MaxV];
vector<int>vec[MaxV];
int N,M;
void dfs(int i ){vis[i] = 1;vector<int>::iterator it;for(it = vec[i].begin() ; it!=vec[i].end(); it++){if(vis[*it] == 0)dfs(*it);}
}
int main(){while(scanf("%d",&N)){if(N==0)break;scanf("%d",&M);memset(vis,0,sizeof(vis));for(int i = 1 ; i <= N; i++)vec[i].clear();for(int i = 0 ; i < M ; i ++){int u,v;scanf("%d%d",&u,&v);vec[u].push_back(v);vec[v].push_back(u);}dfs(1);int cnt = 0 ;bool t1 = false ,t2 = true;for(int i = 1 ; i <= N ; i++){if(!vis[i])cnt++;if(vec[i].size()&1){t2 = false ;}}if (!cnt)t1= true;if(t1 && t2 )printf("1\n");//两个条件同时成立说明为欧拉图else printf("0\n");}return 0;
}

hdu-1878欧拉回路相关推荐

  1. Hdu 1878 欧拉回路[判断是否存在欧拉回路]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1878 题目的意思很简单,就是给你一个无向图..问存在欧拉回路吗?Yes or No.1000个节点.. ...

  2. hdu 1878 欧拉回路

    欧拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. HDU 1878 欧拉回路(入门)

    欧拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. hdu 1116 欧拉回路 并查集 一组字符串能否首尾相连成一个字符串

    主要是欧拉回路的基础知识,用并查集加工处理 注意欧拉回路和并查集的细节判断 不能粘贴复制,一定要理解之后再敲一遍代码,否则浪费更多的时间 #include <stdio.h> #inclu ...

  5. hdoj 1878 欧拉回路

    欧拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  6. 杭电-1878 欧拉回路

    欧拉回路 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. uoj 117 欧拉回路

    1.判断是否为欧拉存在欧拉回路---裸的判断 欧拉回路就是看一笔能不能把途中所有的边跑完没得重复 对于无向边----建立双向边判断每个点的入度是否为2的倍数   1.1 对于有向边---建立单向边判断 ...

  8. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  9. 蓝书3.7 欧拉回路

    T1 欧拉回路 hdu 1878 题目大意: 判断是否存在欧拉回路 思路: 一个无向图存在欧拉回路的条件为所有点的度为偶数 且图联通 1 #include<iostream> 2 #inc ...

  10. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

最新文章

  1. 华硕WL-500W无线路由器使用感受
  2. MySQL 高频面试题,都在这了
  3. BZOJ4432 : [Cerc2015]Greenhouse Growth
  4. 用stream将dgv中的数据导出到word或excel中小例子
  5. MongoDB服务启动与停止命令(Windows环境)
  6. Python——sys.stdout.flush()方法的作用
  7. ios 开发证书导出p12文件_开发者在上传企业签名的应用到后,做到如下几点
  8. C++ 中的this指针详解及实例
  9. 古代大臣上朝时手里拿的是什么东西
  10. 用枚举enum实现单例
  11. MySQL备份与恢复————用LVM快照恢复
  12. python简说(十八)导入模块
  13. [MDB] EXP 导入数据库
  14. 【MySQL】关系型数据库基本知识点
  15. 小米智能插座接入HomeKit
  16. 一个优秀的商业分析师是如何炼成的
  17. python通信信号处理_python学习笔记——信号模块signal(示例代码)
  18. java+selenium——查找定位元素,elements复数定位(driver.findElementsByClassName(mnav);)002...
  19. 音频文件 数据库存储_刚哥谈架构 (六) 谈谈数据库架构
  20. Linux中的竖线(|)意义——管道符号的简单介绍

热门文章

  1. js中every用法_Javascript Array.every()方法
  2. 论文记录3_CycleGAN-损失函数部分
  3. 下列关于java泛型的说法正确_下列关于泛型的说法不正确的一项是:( )_学小易找答案...
  4. 成功需要“十商”(网络转载)
  5. 《程序员的自我修养》读书笔记——动态链接
  6. 猫影视配置2022.06.04
  7. 兄弟连区块链入门教程分享区块链POW证明代码实现demo
  8. 清明节快到了,车辆尾号限行规则提前看!一文带你了解全国各地的尾号限行规则
  9. 利用linux BT5来破解无线 破解无线
  10. 网络防御 --- 恶意软件与反病毒详解