欧拉回路--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是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...
随机推荐
- ZC706+FMCOMMS5应用笔记
1.板载时钟配置. ZC706有200MHz LVDS差分时钟源SiT9102,作为ZYNQ系统参考时钟. COMMS5板子上有ADCLK846时钟Buffer分路器作为AD9361的时钟源,AD84 ...
- Hive的原理和基本用法
一.Hive的概述 1.Hive的定义 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL进行数据读取.写入和管理. 2.Hive的架构图 hive ...
- swoole之建立 websocket server
一.代码部分 <?php /** * 为什么用WebSocket? * HTTP的通信只能由客户端发起 * * WebSocket 协议是基于TCP的一种新的网络协议.实现了浏览器与服务器全双工 ...
- Windows编程常用api
转载网络 黑客常用WIN API函数整理 一.进程 创建进程: CreateProcess (,,,,,,,&si,&pi); WinExec("notepad", ...
- 10 Class文件结构
- java代码静态分析工具
需求:有些基础类型的遍历,值希望它被赋予指定的几个值,赋予其他值能够别编译器(IDEA/eclipse)提醒 Android studu结合自己的插件,引入 <!-- https://mvnre ...
- NO5 grep-head-tail命令
·*****grep:#过滤需要的内容(linux三剑客). -v:排除内容.eg:grep -v oldboy test.txt ·head: #头,头部.读取文 ...
- 小程序 scroll-view 中文字不换行问题
问题描述:在scroll-view 中scroll-x="true"时控制文字超出显示省略号,要求如图: 但实际中会出现如文字不换行或样式错乱的问题. 横向滚动的实现如下: 超过两 ...
- websocket与http
偶然在知乎上看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有.所以转到我博客里,分享一下.比较喜欢看这种博客,读起来很轻松,不枯燥,没有布道师的阵仗 ...
- [LeetCode] 934. Shortest Bridge 最短的桥梁
In a given 2D binary array A, there are two islands. (An island is a 4-directionally connected grou ...