16.拓扑排序与欧拉图

news/2024/11/7 19:26:56/

一、拓扑排序

1.简介

拓扑排序的英文名是 Topological sorting。拓扑排序要解决的问题是给一个图的所有节点排序,目标是将所有节点排序,使得排在前面的节点不能依赖于排在后面的节点。

在一个 D A G DAG DAG(有向无环图)中,我们将图中的顶点以线性方式进行排序,使得对于任何的顶点 u u u v v v 的有向边 ( u , v ) (u,v) (u,v), 都可以有 u u u v v v 的前面。若给定一个 D A G DAG DAG,如果从 i i i j j j 有边,则认为 j j j 依赖于 i i i 。如果 i i i j j j 有路径,则称 i i i 间接依赖于 j j j

若是有环图,则不存在拓扑排序。

2. 求解拓扑排序

  • 从图中选择一个入度为零的点。
  • 输出该顶点,从图中删除此顶点及其所有的出边。
  • 重复上面两步,直到所有顶点都输出,拓扑排序完成。
  • 若图中不存在入度为零的点,此时说明图是有环图,拓扑排序无法完成,陷入死锁。

为了完成这个程序,我们还需要利用 S T L STL STL 库中的队列,同时我们也要注意在拓扑排序中所应用的 B F S BFS BFS 的思想。

3.核心代码

void topu()
{queue<ll> q;for(ll i=1;i<=n;i++)if(du[i]==0)q.push(i);while(!q.empty()){ll u=q.front();q.pop();cout<<u<<" ";for(ll i=p[u];i!=-1;i=e[i].next){ll v=e[i].v;du[v]--;if(du[v]==0)q.push(v);}}
}

时间复杂度为 O ( V + E ) O(V+E) O(V+E)

二、欧拉图

1.概念

  • 欧拉回路:通过图中每条边恰好一次的回路。
  • 欧拉路径:通过图中每条边恰好一次的路径。
  • 欧拉图:具有欧拉回路的图。
  • 半欧拉图:具有欧拉通路但不具有欧拉回路的图。

2.性质

(1)无向图

  • 若一个无向图 G G G 存在欧拉路径,当且仅当 G G G 恰有 0 0 0 2 2 2 个奇度顶点

  • 若一个无向图 G G G 存在欧拉回路,当且仅当 G G G 不存在奇度顶点且连通

  • 若一个无向图 G G G 是包含两个奇度顶点的连通图时, G G G 的欧拉路径必定以这两个点为端点

(2)有向图

  • 若一个有向图 G G G 存在欧拉路径,当且仅当 G G G 是弱连通(将有向边看作无向边后连通)有向图,且满足以下两个条件之一:

    • 所有顶点的入度和出度相同
    • 有一个顶点相差 1 1 1,有一个顶点相差 − 1 -1 1,其他顶点的入度和出度相同
  • 若一个有向图 G G G 存在欧拉回路,当且仅当 G G G 是强连通有向图且所有顶点的入度和出度相同

  • 若一个有向图 G G G 包含两个入度和出度不相同的顶点且有欧拉路径时, G G G 的欧拉路径必定以这两个点为端点

3.求出欧拉路径

(1)无向图

计算无向图的欧拉路经可以用“套圈法”、基于深度优先搜索来实现。 从一个合适的顶点出发进行深度优先搜索。当搜到一个顶点 u u u 时:

  1. 如果此时没有顶点与该顶点相连,那么就将 u u u 加入路径中并回溯
  2. 如果有顶点 v v v 与顶点 u u u 相连,那么就删除无向边 < u , v > <u,v> <u,v>,并继续搜索顶点 v v v 。将所有和 u u u 相邻的顶点遍历完之后,将 u u u 加入路径中。
void dfs(ll u)
{if(du[u]>0){for(ll v=1;v<=n;v++){if(mp[u][v]){mp[u][v]--;mp[v][u]--;du[u]--;dfs(v);}}}ans[++cnt]=u;
}

(2)有向图

方法完全一致,这里可以对链式前向星做一定的优化。

void dfs(ll u)
{for(ll i=p[u];i!=-1;i=p[u]){ll v=e[i].v;p[u]=e[i].next;if(vis[i])continue;vis[i]=true;dfs(v);}ans[++cnt]=u;
}

三、作业

1.拓扑

B3644 【模板】拓扑排序 / 家谱树

P4017 最大食物链计数

P4089 [USACO17DEC]The Bovine Shuffle S

2.欧拉图

P1341 无序字母对

P2731 [USACO3.3]骑马修栅栏 Riding the Fences

P7771 【模板】欧拉路径


http://www.ppmy.cn/news/543273.html

相关文章

tg代理

安装 wget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/MTProxy-Bash/master/install.sh && bash install.sh 卸载 wget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/MTProxy-Bash/master/uninstall.sh…

山东区域华三金牌总代理,三星级服务器代理商

山东博威信息技术有限公司成立于2002年7月9日&#xff0c;每年业绩都以20%-40%的速度增长&#xff0c;现无论是在知名度、信誉、实力、销售能力等各方面都取得了长足的发展&#xff0c;在业界享有很高的声誉。 公司的网络产品有CISCO、H3C,服务器存储类有IBM、HP&#xff0…

河南双轨制直销系统开发推荐奖介绍

很多老板准备做直销&#xff0c;但是直销的模式有些复杂&#xff0c;很多东西都搞不明白&#xff0c;今天就给大家分享一个比较常见的直销模式——双轨制直销系统模式。 双轨制直销模式当中的奖金制度比较多&#xff0c;也就是说直销商可能拿到的奖金就多了很多&#xff0c;其中…

河南直销系统开发如何邀约?

我们今天说一下如何解决邀约的问题&#xff0c;邀约其实很简单&#xff0c;在我们从事直销事业过程当中&#xff0c;我们要不断地去过滤人&#xff0c;那我们肯定要去邀约人&#xff0c;那我们约不来人怎么办&#xff1f; 我们要解决邀约的理由&#xff0c;邀约的前提&#xff…

代理简介

1、正向代理 正向代理类似一个跳板机&#xff0c;代理访问外部资源。比如我是一个用户&#xff0c;我访问不了某网站&#xff0c;但是我能访问一个代理服务器&#xff0c;这个代理服务器呢,他能访问那个我不能访问的网站&#xff0c;于是我先连上代理服务器,告诉他我需要那个无…

【流量代理】代理模式

文章目录 直连模式pac模式全局模式参考 找了好几篇文章&#xff0c;终于找到了Pac的全称。 直连模式 顾名思义直连模式就是不使用任何代理的模式&#xff0c;这种模式下你访问网站时不会走代理ip还是你自己的。 pac模式 这个是大家普遍使用的一种模式全称叫&#xff08;Pro…

郑州计算机五年大专学校排名,2021年河南十大专科学校排名 河南最好的高职院校...

2021年河南十大专科学校排名数据是由中国科学评价研究中心(RCCSE)、武汉大学中国教育质量评价中心(ECCEQ)和中国科教评价网联合发布了2021年中国高职高专院校竞争力排行榜。小编根据上述专科院校数据列出前河南十大专科院校排名&#xff1a; 最新河南十大专科学校排行榜中&…

大数据——Superset安装篇(二)Python3.8环境+MySQL元数据库

1. 实际安装时间 2023-06-20 安装最新版本 $ superset --versionPython 3.8.13 Flask 2.0.3 Werkzeug 2.0.32. 安装所需环境 Python3.8 1&#xff09;安装python3.8环境 使用 Miniconda3-latest-Linux-x86_64 脚本完成 conda包管理器的安装 2&#xff09;conda环境、包管理…