当前位置: 首页 > news >正文

视频网站建设方案西安百度提升优化

视频网站建设方案,西安百度提升优化,重庆公司章程网上查询平台,驻马店 网站建设图论中的回路是指一个路径, 它从某个顶点开始, 经过所有边恰好一次, 并回到起始顶点. 定义 欧拉回路: 从一个顶点出发, 经过每条边恰好一次, 并且最终回到起始顶点. 哈密尔顿回路: 从一个顶点出发, 经过每个顶点恰好一次, 并且最终回到起始顶点. 欧拉路径: 从一个顶点出发, …

图论中的回路是指一个路径, 它从某个顶点开始, 经过所有边恰好一次, 并回到起始顶点.

定义

  • 欧拉回路: 从一个顶点出发, 经过每条边恰好一次, 并且最终回到起始顶点.

  • 哈密尔顿回路: 从一个顶点出发, 经过每个顶点恰好一次, 并且最终回到起始顶点.

  • 欧拉路径: 从一个顶点出发, 访问图中的每一个边恰好一次, 但不需要回到起始顶点.

  • 哈密尔顿路径: 从一个顶点出发, 访问图中的每一个其他顶点恰好一次, 但不需要回到起始顶点.

sample

欧拉回路

无向图的条件

  • 对于无向图, 构成欧拉回路的充要条件是: 所有顶点的度数都必须是偶数.
  • 如果仅有两个顶点的度数为奇数, 则存在从其中一个顶点到另一个顶点的欧拉路径, 但不是欧拉回路.

柯尼斯堡

欧拉证明七桥问题没有解, 因为存在度为奇数的顶点.

有向图的条件

  • 对于有向图, 每个顶点的入度必须等于出度才能构成欧拉回路.
  • 如果仅有一个顶点的出度比入度多 1, 且另一个顶点的入度比出度多 1, 其余顶点的出入度相等, 则存在从出度多 1 的顶点到入度多 1 的顶点的欧拉路径.

求解算法

求解欧拉回路的主要算法包括 Fleury 算法和 Hierholzer 算法:

Fleury 算法解析

Fleury 算法是一种较为直观的方法, 逐步构造欧拉回路, 但其效率较低, 因为需要检查每一步是否会破坏图的连通性.

算法步骤如下:

  1. 选择起点:

    • 如果图中存在欧拉回路, 则可以从任意顶点开始.
    • 如果图中只存在欧拉路径, 则必须从度数为奇数的两个顶点之一开始.
  2. 遍历边:

    • 从当前顶点出发, 选择下一条边进行遍历.
    • 除非没有其他选择, 不然需要避免选择"桥"(或者说割边). 判断某条边是否为桥梁可以通过暂时移除该边并检查图是否仍然连通来实现. 加入断开了这条边之后, 原先的图不再相连, 则此边是一个桥.
  3. 标记已访问的边: 每次选择一条边后, 将其标记为已访问, 并将其从图中移除(或者记录下来以便后续恢复).

  4. 移动到下一个顶点: 移动到所选边的另一端点, 并重复上述过程, 直到所有边都被访问过.

  5. 返回起点:

    • 如果是从欧拉回路的起点开始, 则最终会回到该起点, 形成一个闭合回路.
    • 如果是从欧拉路径的一个端点开始, 则最终会到达另一个端点, 形成一条欧拉路径.
示例

求下图的欧拉路径:

sample

fleury 算法步骤:

  1. 任意选定起点, 假定选择了A., A有两条边, 均不是桥, 任选一个都可以. 假定我们选择了A-B. 此时结果如下:

    f1

  2. 此时我们到达了B, B的的三条边均不是桥, 任选其一. 假定选了B-E. 结果如下:

    f2

  3. 此时我们到达了E, 三条边均可选 假定选了E-D. 结果如下:

    f3

  4. 现在到达了D, 注意D-A是一个桥, 因为此时还有其他边可选, 所不能选D-A.

    f4

  5. 后续步骤不再赘述, 看 gif.

    fig

Hierholzer 算法

Hierholzer 算法是一个更为高效的方法, 通过利用回路合并的思想来构建欧拉回路. 它的基本思想是从任意一个顶点开始, 尝试访问每一条边, 并将访问过的边移除, 直到无法继续前进时, 再回溯寻找新的未访问边, 直到所有的边都被访问过为止.

算法步骤
  1. 选择起点:

    • 从任意一个顶点开始(对于欧拉回路, 任何顶点都可以作为起点; 对于欧拉路径, 则需要从度数为奇数的顶点之一开始).
  2. 初始化路径:

    • 创建一个空列表 path 来存储当前找到的路径.
    • 创建一个栈 stack 并将起点压入栈中.
  3. 遍历边:

    • 当栈不为空时, 执行以下操作:
      1. 弹出栈顶元素: 将栈顶元素取出并设为当前顶点 current_vertex.
      2. 检查相邻边: 检查当前顶点的所有未访问过的相邻边.
      3. 如果存在未访问的边:
        • 随机选择一条未访问的边, 并将其标记为已访问.
        • 将该边的另一端点推入栈中.
      4. 如果没有未访问的边:
        • 将当前顶点添加到 path 列表中.
  4. 合并路径:

    • 当栈为空时, path 列表中的顶点顺序即为所求的欧拉回路. 但由于我们是从后往前添加顶点的, 因此需要反转 path 列表.
  5. 返回结果:

    • 返回反转后的 path 列表, 这就是所求的欧拉回路.
示例演示

针对上题中提到的样例, hierholzer 的步骤如下图所示:

h

需要注意的是:

  1. A被第二次访问的时候, 此时没有其他边可走, 因此需要从栈中弹出A并添加到path中.
  2. 接下来的出栈操作在所有节点访问完毕的时候.
代码实现

以下是一个具体的 C++ 实现的核心部分, 完整代码请参考:

std::vector<int> FindEulerCircuit(int start) {std::stack<int> stack;  // 当前路径std::vector<int> path;  // 存储最终的欧拉回路stack.push(start);while (!stack.empty()) {int currV = stack.top();// 如果当前顶点有未访问的边auto adjList = graph_.Adj(currV);if (!adjList.empty()) {int nextV = *adjList.begin();graph_.RemoveEdge(currV, nextV);stack.push(nextV);} else {// 如果没有未访问的边,则将当前顶点加入电路path.push_back(currV);stack.pop();}}// 反转电路以获得正确的顺序std::reverse(path.begin(), path.end());return path;
}

完整代码请参考: Hierholzer.ixx

时间复杂度

Hierholzer 算法的时间复杂度为 O ( E ) O(E) O(E), 其中 E E E 是图中的边数. 这是因为每条边只会被访问一次, 并且在每次访问时只需要常数时间的操作(如栈操作和边的删除). 这使得 Hierholzer 算法在处理大规模图时非常高效.

汉密尔顿回路

寻找一个给定图是否存在哈密尔顿回路的问题是一个典型的 NP 完全问题, 这意味着目前没有已知的有效算法可以在多项式时间内解决任意图的这个问题. 通常采用的方法包括暴力搜索, 回溯法以及一些启发式的优化策略来尝试解决特定实例的问题.

由于其复杂性, 对于较大的图, 求解哈密尔顿回路往往需要消耗大量的计算资源. 然而, 在某些特殊情况下, 如图具有特定结构时, 可以设计出有效的算法来解决问题. 例如, 在竞赛编程或者算法面试中, 如果图的规模较小(比如不超过 30 个顶点), 可以通过状态压缩动态规划等方法来尝试解决.

http://www.yidumall.com/news/46308.html

相关文章:

  • 郑州网站制作天强科技中国网站排名网
  • 常见的网站空间营销外包公司
  • 企业网站缺点百度广告销售
  • 做系统网站旺道seo推广有用吗
  • wordpress插件 幻灯片西安专业seo
  • 网站是做流程安装百度
  • 直销购物网站开发百度seo优化方案
  • 网站平台搭建要多少网络营销的特点有哪些?
  • 深圳做微信网站公司哪家好整站优化服务
  • 国外域名交易网站汕头seo
  • 做网站的一定要开80或8080端口平台推广是做什么的
  • 网站设计毕业论文ppt西安优化排名推广
  • 邯郸房产58同城深圳seo优化公司哪家好
  • 大气宽屏企业网站源码广州seo关键词优化是什么
  • 可以用自己的电脑做网站吗网址查询地址查询
  • php做网站很快嘛网站推广的技巧
  • 网站创建设计SEO优化象客山东省住房和城乡建设厅
  • 自己做ppt网站seo整站优化更能准确获得客户
  • python 网站开发 案例云优化
  • 建设系统网站全名seo搜索引擎优化岗位要求
  • 汕头网站建设过程搜索百度网址网页
  • 免费建各种网站永久免费个人网站申请注册
  • 泰钢材企业网站源码自建网站平台
  • 如何快速创建网站子域名查询工具
  • 绵阳做网站哪家公司好企业网站建设的基本流程
  • 招标采购导航网汕头百度seo公司
  • 网站改版案例ui设计公司
  • 给赌博网站做推广百度网盘网页版登录入口
  • 沈阳网站开发外包什么是seo标题优化
  • 如何用ps做网站页面设计品牌seo推广