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

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

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

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

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

如何判断一幅图是否有欧拉路径/回路? 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

欧拉回路 欧拉路径相关推荐

  1. 算法提高课——3.10 欧拉路径和欧拉回路

    欧拉路径和欧拉回路 哥尼斯堡七桥问题 以下内容摘自<信息学奥赛一本通·提高篇>. 欧拉回路问题是图论中最古老的问题之一.它诞生于18世纪的欧洲古城哥尼斯堡,普瑞格尔河流经这座城市,人们在两 ...

  2. mysql 欧拉_欧拉路径和欧拉回路

    欧拉路径和欧拉回路 欧拉路径:从某结点出发一笔画成所经过的路线叫做欧拉路径. 欧拉回路:在欧拉路径的基础上又回到起点. a.凡是由偶点组成的连通图,一定可以一笔画成.画时可以把任一偶点为起点,最后一定 ...

  3. 欧拉回路/路径浅谈(七桥问题,两种算法)

    文章目录 前言 引子 欧拉回路/路径 定义 欧拉路径 欧拉回路 无向图(连通) 欧拉回路-无向 欧拉路径-无向 有向图(连通) 欧拉回路-有向 欧拉路径-有向 注意事项 算法 Fluery算法 Hie ...

  4. CSP 201512-4 送货

    文章目录 问题描述 AC代码 C++ java 代码解释 问题描述 为了增加公司收入, F F F 公司新开设了物流业务. 由于 F F F 公司在业界的良好口碑,物流业务一开通即受到了消费者的欢迎, ...

  5. linux 磁盘挂载 uuid,Linux如何根据UUID自动挂载磁盘分区

    一般服务器都有多个硬盘分区,在重启后,这些分区的逻辑位置加载时可能会发生变动,如果使用传统的设备名称(例如:/dev/sda)方式挂载磁盘,就可能因为磁盘顺序变化而造成混乱. Linux环境中每个Bl ...

  6. 算法竞赛入门竞赛 入门经典 第六章 个人记录

    UVa 210 并行程序模拟(放弃 || 待补) 没看懂题意,但是有百度了一下duque 算是对duque有了一个大致的认识和了解 当然也有尝试. 本来想着去hdu找一些duque的题 结果 好像可以 ...

  7. PAT甲级题库参考答案(c++)

    A1001(20 两数相加) #include<iostream> #include<string> using namespace std; int main(){int a ...

  8. [模板][持续更新]欧拉回路与欧拉路径浅析

    Luogu P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与 ...

  9. 【图论专题】欧拉路径和欧拉回路

    A.AcWing 1123. 铲雪车(欧拉路的简单思想) 我们将这个图看成有向图,对于每输入一组数据加两条有向边,需要每条边都至少走一遍 我们先回想一下存在有向图的欧拉路径的充分必要条件 所有点的入度 ...

最新文章

  1. MySQL的字符编码体系(一)——数据存储编码
  2. C#,silverlight中 将颜色字符串的RRGGBB转换成为颜色
  3. mysql备份一个表到ftp_备份部分mysql表并上传至指定ftp服务器目录中
  4. 好看好用的花前月下网易云等级代挂程序(支持扫码登录)
  5. 孙正义辞任阿里董事 阿里:软银仍有权提名一名董事进董事会
  6. php中crypt怎么还原,PHP笔记 —— crypt方法
  7. C语言之字符串探究(七):atoi、itoa——整型数字和字符串的相互转换
  8. 我用了20年ERP系统,但是用它做报表,我却后悔了
  9. ld.so.conf.d配置文件
  10. Visio使用技巧总结
  11. Mail_Android_Video_SW_DDK_Intergration_Guide_And_Codec_User_Manual中文翻译【preface】
  12. Unity InputField光标位置不对
  13. 计算机英语说明文,英语说明文作文
  14. php上传图片到七牛云,PHP拖拽上传图片到七牛云
  15. mysql 法语字符比较_法语词典哪种比较好?
  16. D3.js(v3版本)
  17. bootstrap 后端模板
  18. 二分查找算法(递归+非递归)
  19. MMSC BAPI/自动扩充库位
  20. 【pickle】详解python中的pickle模块(常用函数、示例)

热门文章

  1. Ajax实现原理详解
  2. Activity隐式启动IntentFilter
  3. 20151210小问题2
  4. [转]用Whois获得电信运营商的IP地址是如何分配的?
  5. glClearDepth
  6. 进程间通信之管道通信
  7. git常用命令及冲突解决
  8. 【 CDN 最佳实践】CDN 命中率优化思路
  9. Hadoop MapReduce概念学习系列之MPI和MapReduce(十三)
  10. 云计算解决方案——电信行业