欧拉回路 欧拉路径

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

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

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

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

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

 

如何判断一幅图是否有欧拉路径/回路? 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,一经查实,立即删除!

相关文章

MD5函数

用md5函数 https://blog.csdn.net/whatday/article/details/8024355 MD5算法原理 https://www.cnblogs.com/hjgods/p/3998570.html 其他方法 https://blog.csdn.net/wudishine/article/details/42466831

MMU所起的作用

MMU所起的作用 一、名词解释 ①逻辑地址&#xff08;虚拟地址&#xff09; 用户程序经编译、链接以后形成的每条指令或数据单元的地址&#xff0c;这些地址都是相对于某个基地址来编制的。 ②逻辑地址空间 某个用户程序的虚拟地址的集合。 ③物理地址&#xff08;绝对地址…

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

先说下推挽输出&#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;读…

Dojo API中文 Dojo内容模块概览,初学者

官网&#xff1a;http://dojotoolkit.org/reference-guide/1.10/dojo/index.html#dojo-dojo的翻译 dojo 内容&#xff1a; dojo dojo/dojodojo/_baseAreas of Functionalitydojo是dojo工具箱的基础包。有时被称为“核心”&#xff0c;它包含了最重要的一般适用的软件包和模块。…

分享一篇很不错的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 工具遵循…

CMapStringToPtr::SetAt\CAsyncSocket

CMapStringToPtr::SetAt CMapStringToOb::SetAt 将元素插入到映射;如果找到匹配项&#xff0c;将替换现有元素。 主要方法要在地图中插入元素。 void SetAt( LPCTSTR key, CObject* newValue);参数 key 指定为新元素的键的字符串。 newValue 指定CObject是新元素的值的指针。…

自我鼓励

每一个优秀的人&#xff0c;都有一段沉默的时光&#xff0c;那一段时光&#xff0c;是付出了很多努力&#xff0c;忍受了很多的孤独和寂寞&#xff0c;不抱怨不诉苦&#xff0c;只有自己知道&#xff0c;而当日后说起时&#xff0c;连自己都能被感动的日子。

例用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语言中基本的输入输出函数有&#xff1a; putchar ():把变量中的一个字符常量输出到显示器屏幕上; getchar ();从键盘上输入一个字符常量,此常量就是该函数的值; printf ();把键盘中的各类数据,加以格式控制输出到显示器屏幕上; scanf ();从键盘上输入各类数据,并存放到程…

人格魅力的六法宝

人格魅力的六法宝 1、学会沉默 沉默是一种温柔&#xff0c;一种甜甜的爱心&#xff0c;一种东方的冰清玉洁的美丽&#xff1b;沉默是一种力度&#xff0c;一种坚韧&#xff0c;一种成竹在胸的自信和威仪。在回答某一具体问题时&#xff0c;沉默是你最好的回答。 2、学会微笑 微…

【模板】LCA

最近公共祖先LCA 1 #include<bits/stdc.h>2 #define MAX 100000013 4 using namespace std;5 namespace edge_and_question{6 int tot,q_tot;7 int head[MAX],q_head[MAX];8 9 struct data{ 10 int to; 11 int nxt; 12 int lca;…

手撸双链表,图解

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

VS建lUML画类图

https://blog.csdn.net/caoshangpa/article/details/79797849

C++学习方法

1.把C当成一门新的语言学习(和C没啥关系!真的。);   2.看《Thinking In C》&#xff0c;不要看《C变成死相》;   3.看《The C Programming Language》和《Inside The C Object Model》,不要因为他们很难而我们自己是初学者所以就不看;   4.不要被VC、BCB、BC、MC、TC等词…

IBM DS300 安装

还是不太习惯51的BLOG&#xff0c;用多了其它网站的&#xff01;转载于:https://blog.51cto.com/jackzzs/145512

Python编程之数据结构与算法练习_004

Some排序算法的Python实现。不废话写原理&#xff0c;直接撸代码。 1.Bubble sort 冒泡排序 import random import copymaxSize 10000 maxValue 10000#Generate random data array[0]*maxSize for i in range(maxSize):array[i] random.randint(10,maxValue)#Correct method…

STM32串口用中断还是用轮询

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