欧拉回路 欧拉路径

欧拉路径()定义 : 如果有一条路径使得能够走完所有的边且每一条边经过有且只有一次,这样的路径叫做欧拉路径

欧拉回路定义 : 如果有从起点出发最后回到起点的一条路径使得能够走完所有的边且每条边经过有且只有一次,称其为欧拉回路

根据定义,欧拉回路是欧拉路径的一个子集,存在欧拉回路定存欧拉路径,反之则不一定成立

半欧拉图 : 有欧拉路径而没有欧拉回路的图

欧拉图 : 包含至少一个欧拉回路的图

 

如何判断一幅图是否有欧拉路径/回路? PS : 以下的欧拉路径条件都是针对半欧拉图来说

① 有向图情况

欧拉路径 ==> 有且只有一个点的出度 - 入度 == 1、有且只有一个点的入度 - 出度 == 1、其余点的出入度相等

欧拉回路 ==> 所有点的出度 == 入度

② 无向图情况

欧拉路径 ==> 有且只有两个点的度为奇数(起点、终点)、其他点的度为偶数

欧拉回路 ==> 所有点的度都为偶数

 

以上只能判定路径的有无、而要找到其中一条欧拉路径/回路,有两种算法

一种是 Fluery 算法、一种是 Hierhoizers 算法

Fluery 算法 : 略......、给个链接

Hierhoizers 算法 : 

此算法是基于 DFS 的路径回复算法,前提条件是给其指定好起点

算法会自动寻找欧拉回路、找不到的情况下会找到欧拉路径

/*
开始DFS递归函数(当前顶点 x):寻找与 x 相连的边(x,v):删除 (x,v)删除 (v,x)///如果是无向图的话DFS(v)将x插入到路径栈中
*/struct EDGE{ int v, nxt; bool used; }; ///链式向前星边结构体定义
stack<int> path; ///定义栈记录顶点路径void DFS(int x)
{for(int i=Head[x]; i!=-1; i=Edge[i].nxt){int Eiv = Edge[i].v;if(!Edge[i].used){Edge[i].used = true;DFS(x);}}path.push(x);
}

 

例题 POJ 2337 Catenyms

以 26 个字母为顶点、以给出的单词为边,找出一条字典序最小的欧拉路径就是答案

由于这里要字典序最小,基于我们寻找欧拉路径的DFS算法,所以在进行建图的时候

最好将单词进行字典序排序再来插入到邻接表中即可达到这个目的

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
struct EDGE{ int v, nxt, id; bool used; }Edge[maxn<<2];
int Head[30], cnt, N;
int IN[30], OUT[30];
int St;
int ans[maxn<<2], len;
string str[maxn];inline void init()
{memset(Head, -1, sizeof(Head));memset(IN, 0, sizeof(IN));memset(OUT, 0, sizeof(OUT));cnt = 0;St = 0x3f3f3f3f;
}inline void AddEdge(int From, int To, int ID)
{Edge[cnt].used = false;Edge[cnt].id = ID;Edge[cnt].v = To;Edge[cnt].nxt = Head[From];Head[From] = cnt++;
}void DFS(int v, int id)///由于是要边路径而不是顶点路径,所以要带个边参数
{for(int i=Head[v]; i!=-1; i=Edge[i].nxt){if(!Edge[i].used){Edge[i].used = true;int Eiv = Edge[i].v;DFS(Eiv, Edge[i].id);}}if(id != -1)ans[len++] = id;//    for(int i=Head[v]; i!=-1; i=Edge[i].nxt){///如果不像代边的编号参数,可以这样写
//        if(!Edge[i].used){                   ///也可以达到记录边路径的作用
//            Edge[i].used = true;
//            DFS(Edge[i].v);
//            ans[len++] = Edge[i].id;
//        }
//    }
}int main(void)
{int nCase;scanf("%d", &nCase);while(nCase--){init();scanf("%d", &N);for(int i=0; i<N; i++)cin>>str[i];sort(str, str+N);for(int i=N-1; i>=0; i--){///将边从大的到小的插入,因为是链式向前星存储int Len = str[i].length();int From = str[i][0] - 'a';int To = str[i][Len-1] - 'a';AddEdge(From, To, i);IN[To]++, OUT[From]++;St = min(To, min(St, From));///记录一下DFS的起点,对应了有欧拉回路的情况
        }int Not_equal, St_num, Des_num;Not_equal = St_num = Des_num = 0;for(int i=0; i<26; i++){if(!IN[i] && !OUT[i]) continue;if(IN[i] != OUT[i]) Not_equal++;if(OUT[i] - IN[i] == 1){St_num++;St = i;///此时已经可以判定没有欧拉回路了,改变起点,将出度多的作为起点}else if(IN[i] - OUT[i] == 1)Des_num++;}if(Not_equal > 0){///如果有点的出入度不想等if(!(Not_equal == 2 && St_num == 1 && Des_num == 1)){///并没有欧拉路径puts("***");continue;}}len = 0;DFS(St, -1);///恢复欧拉路径if(len != N){puts("***");continue;}for(int i=len-1; i>=0; i--){if(ans[i] == -1) continue;cout<<str[ans[i]];if(i > 0) putchar('.');else puts("");}}return 0;
}
/*
2
6
aloha
arachnid
dog
gopher
rat
tiger
3
oak
maple
elm
*/
View Code

 

转载于:https://www.cnblogs.com/LiHior/p/8747203.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

终于搞清楚开漏输出和推挽输出这个鬼东西

先说下推挽输出&#xff0c;简单的说&#xff0c;就是想输出高电平&#xff0c;就输出高电平&#xff0c;想输出低电平就输出低电平。推挽电路上面是NPN三极管&#xff0c;下面是PNP三极管&#xff0c;请注意输入端和输出端的波形。下面是输入波形当输入为正时&#xff0c;上面…

被称为“C#圣经”的权威著作!

媒体评论 “哇&#xff0c;这本书太棒了&#xff01;对.NET 3.5和CLR的阐释非常深入。它已经成为我的头号参考书。强烈推荐给所有.NET程序员。” ——Jeff Wilcox&#xff0c;微软.NET开发团队资深工程师 “Troelsen大师王者归来了&#xff01;C#程序员分为两类&#xff1a;读…

分享一篇很不错的CMake入门文章,值得收藏细读!

https://www.hahack.com/codes/cmake/▌什么是 CMake?你或许听过好几种 Make 工具&#xff0c;例如 GNU Make &#xff0c;QT 的 qmake &#xff0c;微软的 MS nmake&#xff0c;BSD Make&#xff08;pmake&#xff09;&#xff0c;Makepp&#xff0c;等等。这些 Make 工具遵循…

例用C# 变更文件夹时间

想变更文件夹的时间.以前做了一个软件.是变更文件的时间,应用了C# API.这次和上一次相同,用Form来通过外部对时间进行确认.确认后应用C#中,System.IO ->Directory->SetCreationTime 来对时间进行变更.以下是C#应用的例子.基本相同.但是,不要忘记小问题,下面的例子的命名空…

Linux 30岁,这些年经历了什么?

3月19日&#xff0c;Linux基金会在Twitter上发布推文宣布&#xff0c;其小企鹅的标志“Tux”已经30周岁了&#xff0c;还为其设计了一系列的庆祝海报&#xff0c;以便大家转发分享。虽然离Linux的生日还有一段时间&#xff0c;但是今年Linux基金会已经提前先帮小企鹅“Tux”过生…

用CSS画基本图形

用CSS画基本图形 1、正方形 代码如下&#xff1a; #square { width: 100px; height: 100px; background: red; } 2、长方形 代码如下:#rectangle { width: 200px; height: 100px; background: red; } 3、圆形 代码如下:#circle { width: 100px; height: 100px; …

手撸双链表,图解

C语言&#xff0c;链表C实现单向链表深入理解Linux内核链表跟单链表不同&#xff0c;双链表的节点包含两个指针&#xff0c;一个指针指向上一个元素&#xff0c;一个指针指向下一个元素。▌如下图学习数据结构的时候&#xff0c;要像认识一个人一样&#xff0c;要了解这个人有什…

STM32串口用中断还是用轮询

1.从轮询到中断很多同学都不喜欢用中断&#xff0c;而偏爱用轮询的操作方式。这是不是和我们的天性有关呢&#xff1f;每个人都喜欢一切尽在掌握中&#xff0c;肯定都不喜欢被打断。我们常常都有这样的经验&#xff1a;正在跟别人说一件事&#xff0c;然后突然有个电话打进来&a…

使用Buildroot为I.MX6制作根文件系统

1.引言接触Freescale/NXP的I.MX6处理器大概有了两年多的时间&#xff0c;对于一个最初玩MCU的我来说&#xff0c;真是面临了很多的挑战。最让我感到郁闷和崩溃的是那个官方的基于Yocto的开发环境&#xff0c;搭建它要求真是太高了&#xff0c;机器得有上百G的空间&#xff0c;U…

扁平的信标灯

▌交流磁场信号会改变地磁计吗&#xff1f;卓大&#xff0c;我想问个问题&#xff0c;智能车比赛的交流信号磁场会对地磁计产生影响吗?▓ 回复&#xff1a; 在今年的智能车竞赛中存在两个交流信号源&#xff1a;&#xff08;1&#xff09;第一种是电磁赛道上的电磁导引线&…

如何选择合适的Web安全网关?

日益加剧的网络威胁让Web安全网关&#xff08;Web Security Gateway&#xff0c;WSG&#xff09;逐渐成为企业边界网络安全防护的新宠。基于OSI模型第七层(应用层)的Web安全网关具有反恶意软件、上网行为管理以及安全审计等诸多安全检测或管控能力。然而面对铺天盖地的广告和琳…

屏下指纹介绍

一、光学指纹问题现状光学指纹当前随着成本的下降&#xff0c;各大厂商都在低中高端旗舰用上了光学指纹。有别于传统的电容指纹&#xff0c;光学指纹在解锁性能上目前都进行了优化&#xff0c;性能接近电容指纹。二、光学指纹电容指纹原理两者原理都是对指纹的纹路脊谷进行信号…

ABAP Netweaver和Hybris里获得内存使用统计数据

ABAP Netweaver 事物码ST06 Hybris 每隔5秒钟&#xff0c;Hybris Administration console会发起一个到Java后台的AJAX查询请求&#xff1a; 这个5秒的时间间隔定义在project.properties配置文件里&#xff0c; 然后使用JavaScript的setInterval建立定期轮询&#xff1a; Java后…

STM32做平衡小车,代码,PCB都现成的,妈妈再也不用担心我的毕业设计了

▌一、硬件介绍主控芯片用的是100脚的STM32F103VET6&#xff0c;陀螺仪用的是MPU6050&#xff0c;电机驱动用的是TB6612&#xff0c;蓝牙是汇承的HC05邮票孔封装的&#xff0c;WIFI用的是济南有人科技的USR-WIFI232-S&#xff0c;小车底盘用的是平衡小车之家的某一款带编码器的…

Apache 配置:是否显示文件列表

Apache 配置&#xff1a;是否显示文件列表 进入虚拟主机配置文件 显示文件列表的话 options Indexes FollowSymLinks 不显示文件列表的话 options FollowSymLinks 文章来源&#xff1a;刘俊涛的博客 地址&#xff1a;http://www.cnblogs.com/lovebing 欢迎关注&#xff0c;有问…

微信越滑越卡

这篇文章是我的朋友小二哥写的&#xff0c;他解决了一个问题并提交了一个补丁给google合入&#xff0c;当然了&#xff0c;这也是他第一次提交补丁被google采纳。我觉得这才是做技术的样子&#xff0c;二哥也很喜欢篮球&#xff0c;&#xff0c;为二哥吹一波。哈哈。关于这次补…

扁平化可伸展导航

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>扁平化可伸展导航[原创]</title><link rel"stylesheet" type"text/css" href"nav.css"><link rel"stylesheet" t…

大佬为何可以把单片机描述得如此形象生动?

某年某日某产房&#xff0c;你诞生了&#xff08;power up , 上电运行&#xff09;&#xff0c;结果你不哭&#xff0c;医生把你提起来&#xff0c;屁股上狠狠一巴掌&#xff0c;你哇哇大哭&#xff08;reset, 复位成功&#xff09;&#xff0c;护士给你检查&#xff0c;看有没…

51单片机温度控制系统报警器,不会做课程设计的就拿走

▌功能说明&#xff08;1&#xff09;单片机读取温度传感器当前的温度值并在LCD液晶显示屏上的第一行显示当前的温度值&#xff0c;如Temp&#xff1a;27.5℃。&#xff08;2&#xff09;单片机读取按键状态并通过人为手动按键部分来设置最低温度到最高温度的温度范围后&#x…

不要怕辛苦

先说点事情一直以来我都非常喜欢跟大家交流各种问题&#xff0c;自我觉得回答比较用心&#xff0c;可能最近因为很多人毕业&#xff0c;遇到抉择的问题比较多&#xff0c;所以这类的提问也偏多一些。从开始做公众号到现在&#xff0c;支持我的人很多。有些读者从开始关注到现在…