欧拉回路--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是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...
随机推荐
- wumii 爆款总结经验
在正式创办无秘之前,我们反思前几次创业失败的教训,深刻领悟两点: 第一,内容推荐的精准度取决于平台收集用户数据的能力,如果没有用户行为数据,产品无法做内容推荐,而通过简单的新闻排序,延长用户浏览单篇文 ...
- mysql 索引优化法则
建表语句 CREATE TABLE staffs( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR (24) NOT NULL DEFAULT '' C ...
- Xeon 第一次训练赛 苏州大学ICPC集训队新生赛第二场(同步赛) [Cloned]
A.给出一个字符串,求出连续的权值递增和,断开以后权值重新计数,水题 #include<iostream> #include<string> #include<cmath ...
- Hive事务原理和Datax同步事务表问题解决
一.事务的概述 1.定义 事务就是一组单元化操作,这些操作要么都执行,要么都不执行,是一个不可分割的工作单位. 2.特点 事务(transaction)具有的四个要素:原子性(Atomicity).一 ...
- 机器学习中 为何要使用 独热编码 one-hot
背景 接触tensorflow时,学习到mnist,发现处理数据的时候采取one-hot编码,想起以前搞FPGA状态机遇到过格雷码与独热码. 解析: 将离散型特征使用one-hot编码,确实会让特征之 ...
- Centos7下 Oracle11G自动备份
1.创建备份目录: [root@Centos ~]# mkdir -p /home/oracle/backup 2.设置目录权限: [root@Centos ~]# chown -R oracle:o ...
- python练习题4
1.将字符串“老男孩”转换成UTF-8编码的字节类型 s = "老男孩" bytes(s,'utf8') s.encode('utf8') 2.简述globals(),locals ...
- 解决oracle 11g 导出空表的方法
ORACLE 11G中有个新特性,当表无数据时,不分配segment,以节省空间. 解决方法: 1)insert一行,再rollback就产生segment了 该方法是在在空表中插入数据,再删除,则产 ...
- TS文件极简合并
TS文件是可以直接通过二进制拷贝连接的方式进行合并的,一般采用如下的命令行参数:copy /b 1.ts+2.ts+3.ts new.ts 这个例子就是将1.ts.2.ts.3.ts三个文件按顺序连接 ...
- 使用 mtd-utils 烧写Arm Linux 系统各个部分
有关博客:<Arm-Linux 移植 mtd-utils 1.x>.<mtd-utils 的 使用> 背景: 作为一项技术储备,可用于增强系统可维护性. 要求: 要求主板以mt ...