欧拉回路--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是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...
随机推荐
- 0. GC 前置知识
阅读<垃圾回收的算法与实现>时记录的一些笔记. 对象 在GC的世界中,对象表示的是"通过应用程序利用的数据的集合" 头 我们将对象中保存对象本身信息的部分称为头.头主要 ...
- 学习 Ansible Playbook,有这篇文章就够了!
https://mp.weixin.qq.com/s?__biz=MzAwNTM5Njk3Mw==&mid=2247487361&idx=1&sn=b50327df2949e4 ...
- 常用keycode列表
KEYCODE列表 电话键 KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOME 按键Home 3 KEYCODE_MENU 菜单键 82 K ...
- 吴裕雄--天生自然JAVA数据库编程:JDBC操作步骤及数据库连接操作
public class ConnectionDemo01{ // 定义MySQL的数据库驱动程序 public static final String DBDRIVER = "org.gj ...
- vs2010编译C++ 运算符
// CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include &l ...
- vs2010编译C++ 静态成员函数的引用
// CTest.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using names ...
- Linux远程上传文件
#对拷文件夹 (包括文件夹本身) scp -r /home/slk root@192.168.1.5:/home # 对拷文件并重命名 scp /home/a.txt root@192.168.1.5 ...
- Ruoyi的确不错,不知后续能否坚持 允许商用
对于一个开源项目,作者的确很优秀: 在我们现在这个环境,能把一个开源项目做到这个规模,相当不容易:给作者点赞: 不过我也心里嘀咕,不知道后面哪天这个哥们突然发声明,不允许商用呢? 先偷偷留个证据,省的 ...
- SPI协议解析
1. SPI物理层 SPI通讯需要使用4条线:3条总线和1条片选 . SPI遵循主从模式,3条总线分别是SCK.MOSI和MISO,片选线为nSS(低电平有效),SPI协议适用于一主多从的工作场景: ...
- JuJu团队12月1号工作汇报
JuJu团队12月1号工作汇报 JuJu Scrum 团队成员 今日工作 剩余任务 困难 于达 修改generator函数 优化代码 不熟悉julia 婷婷 和金华一起调试main.jl 继 ...