欧拉回路--P2731 骑马修栅栏 Riding the Fences
实在懒得复制题干了 *传送
1.定义
2. 定理及推论
无向图G存在欧拉通路的充要条件是:
1) 当G是仅有两个奇度结点的连通图时,G的欧拉通路必以此两个结点为端点。
2) 当G是无奇度结点的连通图时,G必有欧拉回路。
有向图D存在欧拉通路的充要条件是:
推论2:
1) 当D除出、入度之差为1,-1的两个顶点之外,其余顶点的出度与入度都相等时,D的有向欧拉通路必以出、入度之差为1的顶点作为始点,以出、入度之差为-1的顶点作为终点。
2) 当D的所有顶点的出、入度都相等时,D中存在有向欧拉回路
求解:
A. DFS搜索求解欧拉回路
基本思路:利用欧拉定理判断出一个图存在欧拉回路或欧拉通路后,选择一个正确的起始顶点,用DFS算法遍历所有的边(每一条边只遍历一次),遇到走不通就回退。在搜索前进方向上将遍历过的边按顺序记录下来。这组边的排列就组成了一条欧拉通路或回路。
#include<cstdio> #include<stdio.h> #include<cstring> #include<algorithm> #define MAX 2010 using namespace std; int maps[MAX][MAX]; int in[MAX]; int t[MAX]; int flag; int k; int Max,Min; int DFS(int x) { int i; for(i=Min;i<=Max;i++) { if(maps[x][i])///从任意一个与它相连的点出发 { maps[x][i]--;///删去遍历完的边 maps[i][x]--; DFS(i); } } t[++k]=x;///记录路径,因为是递归所有倒着记 } int main() { int n,i,x,y; Max=-; Min=; flag=; scanf("%d",&n); ;i<=n;i++) { scanf("%d%d",&x,&y); maps[x][y]++; maps[y][x]++; Max=max(x,max(y,Max)); Min=min(x,min(y,Min)); in[x]++; in[y]++; } for(i=Min;i<=Max;i++) { )///存在奇度点,说明是欧拉通路 { flag=; DFS(i); break; } } if(!flag)///全为偶度点,从标号最小的开始找 { DFS(Min); } ;i--) { printf("%d\n",t[i]); } ; }
B. Fleury(佛罗莱)算法
#include <cstdlib> #include <cstring> #include <cstdio> #include <iostream> #include <algorithm> using namespace std; ]; int top; int N,M; ][]; void dfs(int x) { int i; top++; ans[top]=x; ; i<=N; i++) { ) { mp[x][i]=mp[i][x]=;///删除此边 dfs(i); break; } } } void fleury(int x) { int brige,i; top=; ans[top]=x;///将起点放入Euler路径中 ) { brige=; ; i<=N; i++) /// 试图搜索一条边不是割边(桥) { )///存在一条可以扩展的边 { brige=; break; } } if (!brige)/// 如果没有点可以扩展,输出并出栈 { printf("%d ", ans[top]); top--; } else /// 否则继续搜索欧拉路径 { top--;///为了回溯 dfs(ans[top+]); } } } int main() { int x,y,deg,num,start,i,j; scanf("%d%d",&N,&M); memset(mp,,sizeof (mp)); ;i<=M; i++) { scanf("%d%d",&x,&y); mp[x][y]=; mp[y][x]=; } num=; start=;///这里初始化为1 ; i<=N; i++) { deg=; ; j<=N; j++) { deg+=mp[i][j]; } ==)///奇度顶点 { start=i; num++; } } ||num==) { fleury(start); } else { puts("No Euler path"); } ; }
那这道题就是一个欧拉回路的板子
#include<iostream> #include<cstdio> #include<cmath> using namespace std; ][];//记录两个点之间的路径个数 ];//辅助记录奇点 ];//记录路径 ; ,Min=1e9; int DFS(int x) { int i; for(i=Min;i<=Max;i++) { if(map[x][i]) { map[x][i]--; map[i][x]--; DFS(i); } } t[++k]=x; } int main() { scanf("%d",&n); ;i<=n;++i) { scanf("%d%d",&x,&y); map[x][y]++; map[y][x]++; du[x]++; du[y]++; Max=max(Max,max(x,y)); Min=min(Min,min(x,y)); } ; ;i<=Max;++i) { ) { start=i; break; } } DFS(start); ;i--) { printf("%d\n",t[i]); } ; }
欧拉回路--P2731 骑马修栅栏 Riding the Fences的更多相关文章
- P2731 骑马修栅栏 Riding the Fences 题解(欧拉回路)
题目链接 P2731 骑马修栅栏 Riding the Fences 解题思路 存图+简单\(DFS\). 坑点在于两种不同的输出方式. #include<stdio.h> #define ...
- 洛谷P2731 骑马修栅栏 Riding the Fences
P2731 骑马修栅栏 Riding the Fences• o 119通过o 468提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题解 最新讨论 • 数据有问题题 ...
- 洛谷 P2731 骑马修栅栏 Riding the Fences 解题报告
P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样 ...
- 洛谷 P2731 骑马修栅栏 Riding the Fences
P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样 ...
- P2731 骑马修栅栏 Riding the Fences
题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶 ...
- luogu P2731 骑马修栅栏 Riding the Fences
入度为奇数的点,搜他. 最好邻接矩阵... #include<cstdio> #include<iostream> #define R register int using n ...
- LG2731 骑马修栅栏 Riding the Fences
题意 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点( ...
- 「USACO」「LuoguP2731」 骑马修栅栏 Riding the Fences(欧拉路径
Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编 ...
- USACO Section 3.3 骑马修栅栏 Riding the Fences
题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...
随机推荐
- spark动态资源(executor)分配
spark动态资源调整其实也就是说的executor数目支持动态增减,动态增减是根据spark应用的实际负载情况来决定. 开启动态资源调整需要(on yarn情况下) 1.将spark.dynamic ...
- php 键值数组搜索查询
php 键值数组查询 ,需要先将其转换为纯数组,然后才能用in_array 进行搜索. $arr_combos = [ ['id' => '1001', 'value' => 'zs' ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:内容居中
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- suse下静默方式安装oracle(无图形界面)
以 http://www.cnblogs.com/0201zcr/p/4728241.html 为主 以 http://www.cnblogs.com/jyzhao/p/5001782.html 为参 ...
- Java笔记--异常
1.异常分为两类: --1)Error:Java虚拟机无法解决的严重问题(例如资源耗尽等): --2)Exception:其他编程错误或偶然的外在因素导致的一般性问题(例如空指针异常.读取的文件不存在 ...
- 页面的html调试
点击页面按下键盘的F12,或者鼠标右键选择检查(N) 会弹出一个窗口,这个窗口就是调试窗口 如上图所示,第一个图标是标签元素选择器,点击使用后,在页面上移动,会在Elements的区域找到你鼠标选中的 ...
- 2020牛客寒假算法基础集训营4 I 匹配星星
https://ac.nowcoder.com/acm/contest/3005/I 又做麻烦了,悲催... 将所有星星按x坐标为第一关键字,z为第二关键字排好序 那么一个z=1的星星匹配的是x比它小 ...
- 在ubuntu中使用ipython
python自带的shell实在是不怎么好用 大家可以用一下ipython这个软件,它可以自动缩进,补齐,语法高亮等 安装办法: sudo apt install ipython #这个是安装2.7的 ...
- Golang的标识符命名规则
Golang的标识符命名规则 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.关键字 1>.Go语言有25个关键字 Go语言的25个关键字如下所示: break,defau ...
- 网卡工作原理和wireshark混杂模式
通过设置网卡为混杂模式就能捕获局域网内所有发包内容,包括非广播包和非发给自己主机的数据包 这是为什么呢? 即主机A发送一个数据包给主机B,我作为主机C怎么也能截获这个数据包呢,原理是什么? 我的网卡为 ...