欧拉路、欧拉回路的概念及判定算法

  • 欧拉路的存在性判定

  • 欧拉图(欧拉回路的存在性)的判定

  • 代码实现

    • 欧拉路的判定
  • 欧拉回路的寻找方案

欧拉路问题

=====================================================================

欧拉路问题——也被称为一笔画问题(Eulerian graph)是图论中一个著名的问题,

由欧拉解决。

欧拉路


给定一张无向图,若存在一个从节点S到节点T的路径,经过每条边一次且仅经过一次(节点可以重复经过),则称路径为S到T的欧拉路

欧拉回路


特别地,若存在一条欧拉路,并且这条欧拉路的起点和终点是同一个起点,则称该路径为欧拉回路

欧拉路的存在性判定


  • 无向图

无向图中存在欧拉路,当且仅当无向图连通,并且图中恰好有两个节点的度数为奇数,其他节点的度数都是偶数。这两个度数为奇数的节点就是欧拉路的起点S和终点T。

  • 有向图

入度度数记为-1,出度记为+1,每个节点的度数求和。

那么,存在欧拉路当且仅当仅有一个度数为+1(起点),仅有一个点度数为-1,(终点),其余点的度数都为 0。

欧拉图(欧拉回路的存在性)的判定


一张无向图为欧拉图,当且仅当无向图连通,并且每个点的度数都是偶数

代码实现

====================================================================

欧拉路的判定


就是统计一下度即可,比较简单。

欧拉回路的寻找方案


(注:欧拉路的寻找与之类似)

DFS + 递归

时间复杂度: O ( n ∗ m ) O(n*m) O(n∗m)

#include

#include

using namespace std;

const int N = 100010;

const int M = 1000010;

int head[N], ver[M], nxt[M], idx = 1;

bool vis[M];

stack st;

void add(int x, int y) {

ver[++idx] = y;

nxt[idx] = head[x];

head[x] = idx;

}

// 遍历 x 所在的环

void dfs(int x) {

for (int i = head[x]; i; i = nxt[i]) {

if (!vis[i]) {

vis[i] = vis[i ^ 1] = true;

int y = ver[i];

dfs(y);

}

}

// 由于递归的特性,是在结尾时记录,而不是在开头时记录。

// 而且这里是逆序的,所以用了栈。

st.push(x);

}

void euler() {

dfs(1);

}

int main() {

int n, m;

cin >> n >> m;

for (int i = 0; i < m; i++) {

int x, y;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
3739440149)]

[外链图片转存中…(img-RrVxaldp-1713739440150)]

[外链图片转存中…(img-yBNUfxt0-1713739440150)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是用C++编写的代码,实现了欧拉回路判定、Fleury算法和DFS判割边,并将有向图以邻接矩阵形式存储在文件中: ```cpp #include <iostream> #include <fstream> #include <vector> using namespace std; class Graph { private: int V; // 顶点数 vector<vector<int>> adjMatrix; // 邻接矩阵 public: Graph(int vertices) { V = vertices; adjMatrix.resize(V, vector<int>(V, 0)); } void addEdge(int src, int dest) { adjMatrix[src][dest] = 1; } void removeEdge(int src, int dest) { adjMatrix[src][dest] = 0; } bool isEulerian() { // 检查每个顶点的入度和出度是否相等 for (int i = 0; i < V; i++) { int inDegree = 0, outDegree = 0; for (int j = 0; j < V; j++) { if (adjMatrix[i][j] == 1) outDegree++; if (adjMatrix[j][i] == 1) inDegree++; } if (inDegree != outDegree) return false; } return true; } void DFS(int v, vector<bool>& visited) { visited[v] = true; for (int i = 0; i < V; i++) { if (adjMatrix[v][i] && !visited[i]) { removeEdge(v, i); DFS(i, visited); } } } void printEulerPath(int start) { vector<bool> visited(V, false); DFS(start, visited); for (int i = 0; i < V; i++) { if (visited[i]) { for (int j = 0; j < V; j++) { if (adjMatrix[i][j]) { cout << i << " -> " << j << endl; removeEdge(i, j); break; } } } } } void findEulerPath() { if (!isEulerian()) { cout << "该图不存在欧拉回路!" << endl; return; } int start = 0; for (int i = 0; i < V; i++) { int degree = 0; for (int j = 0; j < V; j++) { if (adjMatrix[i][j] == 1) degree++; } if (degree % 2 == 1) { start = i; break; } } cout << "欧拉回路:" << endl; printEulerPath(start); } void saveToFile(const string& filename) { ofstream outputFile(filename); if (!outputFile) { cout << "无法打开文件!" << endl; return; } for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { outputFile << adjMatrix[i][j] << " "; } outputFile << endl; } outputFile.close(); cout << "图已保存到文件:" << filename << endl; } }; int main() { int V, E; cout << "请输入顶点数:"; cin >> V; cout << "请输入边数:"; cin >> E; Graph graph(V); cout << "请输入边的连接关系:" << endl; for (int i = 0; i < E; i++) { int src, dest; cout << "边 " << i + 1 << " 的起点和终点:"; cin >> src >> dest; graph.addEdge(src, dest); } string filename = "graph.txt"; graph.saveToFile(filename); graph.findEulerPath(); return 0; } ``` 请注意,该代码实现了欧拉回路的查找和判断,以及将有向图以邻接矩阵形式保存到文件中。你可以根据需要自行调整输入和输出的格式。运行代码后,你需要依次输入顶点数、边数以及边的连接关系。最终,程序将输出欧拉回路径,并将邻接矩阵保存到名为"graph.txt"的文件中。 希望这段代码对你有帮助!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值