图论知识整理(2) 拓扑排序、最短路、最小生成树

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

发现以前图论学的很不好,什么都不会,现在开始整理图论知识了

作者就是个蒟蒻,ORZ各位大神们

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

定义:对一个有向无环图(Directed Acyclic Graph,简称DAG)进行拓扑排序,将图中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。

说的好像很有道理,然而我并没有看懂它在讲什么。。

就比如说现在有一份工作,这份工作有5个部分,分别为v1,v2,v3,v4,v5

好了,那么要做v2首先得做v1、v3;要做v1首先得做v4、v5

那么一个拓扑排序的序列就是v4、v5、v1、v3、v2

其实就表示制约与被制约的关系(不知道描述的清不清楚)

有向图存在环就不鞥呢进行拓扑排序。

拓扑排序算法:

  每次挑选入度为0的顶点输出(不计次序,所以答案不唯一)。

  如果最后发现输出的顶点数小于n(或者写成|V|),则表明有回路存在。

  初始化:top=0 (栈顶指针);

  将初始状态所有入度为0的顶点压栈;

  i=0 (计数器);

  While top>0 (栈非空) do

    顶点v(栈顶元素)出栈并输出;

    计数器i增加1;

    For 与v邻接的顶点u do //用邻接表,每条边被访问1次,所以总的复杂度是O(|E|);而用邻接矩阵,则每次需要O(n)的复杂度;

      dec(indgr[u]);

      If indgr[u]=0 then 顶点u入栈;

  if i<|V| then exit(有回路信息)。

  最短路问题:

在带权图G =(V,E)中,若顶点 Vi,Vj是图G的两个顶点,从顶点Vi到Vj的路径长度定义为路径上各条边的权值之和。 从顶点Vi到Vj可能有多条路径,其中路径长度最小的一条路径称为顶点Vi到Vj的最短路径。 对于不带权的图,只要认为每条边权值是1,即可当作带权图一样处理了。

单源最短路径SSSP(Single-Source Shortest Path) 从某个顶点(源点)到其它顶点(终点)的最短路径

  常用算法:

  Dijkstra  

  Bellman-Ford(升级为SPFA)

多源最短路径APSP(All Pairs Shortest Paths) 求图中每一对顶点间的最短路径。

  常用算法:

  Floyd

1. SPFA

每次取出队首结点u,并且用u点当前的最短路径估计值对边(u,v)进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点加入队列。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。

判断有无负环:如果某个点进入队列的次数超过N/2次,则存在负环。平均来说O(kE),k为较小的常数。

但是可以被网格图和负权环卡到O(VE)

——wyh聚聚

2. Dijkstra

初始化: dis[v]=w[s,v];

其中,w[s,v]=maxint表示s到v无直接边

dis[s]=0; S={s}; //S表示已经拓展的点集

For i:=1 to n-1 do 从V-S中取出一个顶点u进行拓展,

  要求:dis[u]=min{dis[v]|v∈V-S} //此处也是算法的关键,s到u的最短路径d[u]已经不可能再小了。此处可以用堆优化。

  S=S+{u}

  For u连出的每一条边<u,v> do

    Relax(u,v)

不加堆优化O(V^2) 建议稠密图使用

加堆优化O(ElogE) 建议稀疏图使用

3. Floyd:这个实在太简单了,就不讲了,利用动态规划的思想,复杂度O(V^3),但是可以求所有点对之间的最短路径。

但是一般来说没有必要求那么多。

要求的话,一种用Floyd,O(V^3),一种用SPFA或Dijkstra,乘上V,SPFA O(kVE) Dijkstra O(V^3), 堆优化O(VElogE)

(= =)貌似也讲太多了。。

最小生成树

一个连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。 对于连通的带权图G,其生成树也是带权的。 生成树上各边权值的总和,称为该树的权。 权值最小的生成树,称为G的最小生成树(MST,Minimum Spanning Tree)。 解决最小生成树问题一般有两种算法Prim和Kruskal。

1. PRIM

Prim算法基于一种贪心策略: 每次选取离当前点集最近的点加入MST。 多用于稠密图。 初始时,MST是只包含一个点的集合,由于每个点最终都要被包含在MST内,所以Prim算法可以由图中的任意一点开始。与dji

---恢复内容结束---

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

发现以前图论学的很不好,什么都不会,现在开始整理图论知识了

作者就是个蒟蒻,ORZ各位大神们

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

定义:对一个有向无环图(Directed Acyclic Graph,简称DAG)进行拓扑排序,将图中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。

说的好像很有道理,然而我并没有看懂它在讲什么。。

就比如说现在有一份工作,这份工作有5个部分,分别为v1,v2,v3,v4,v5

好了,那么要做v2首先得做v1、v3;要做v1首先得做v4、v5

那么一个拓扑排序的序列就是v4、v5、v1、v3、v2

其实就表示制约与被制约的关系(不知道描述的清不清楚)

有向图存在环就不鞥呢进行拓扑排序。

拓扑排序算法:

  每次挑选入度为0的顶点输出(不计次序,所以答案不唯一)。

  如果最后发现输出的顶点数小于n(或者写成|V|),则表明有回路存在。

  初始化:top=0 (栈顶指针);

  将初始状态所有入度为0的顶点压栈;

  i=0 (计数器);

  While top>0 (栈非空) do

    顶点v(栈顶元素)出栈并输出;

    计数器i增加1;

    For 与v邻接的顶点u do //用邻接表,每条边被访问1次,所以总的复杂度是O(|E|);而用邻接矩阵,则每次需要O(n)的复杂度;

      dec(indgr[u]);

      If indgr[u]=0 then 顶点u入栈;

  if i<|V| then exit(有回路信息)。

  最短路问题:

在带权图G =(V,E)中,若顶点 Vi,Vj是图G的两个顶点,从顶点Vi到Vj的路径长度定义为路径上各条边的权值之和。 从顶点Vi到Vj可能有多条路径,其中路径长度最小的一条路径称为顶点Vi到Vj的最短路径。 对于不带权的图,只要认为每条边权值是1,即可当作带权图一样处理了。

单源最短路径SSSP(Single-Source Shortest Path) 从某个顶点(源点)到其它顶点(终点)的最短路径

  常用算法:

  Dijkstra  

  Bellman-Ford(升级为SPFA)

多源最短路径APSP(All Pairs Shortest Paths) 求图中每一对顶点间的最短路径。

  常用算法:

  Floyd

1. SPFA

每次取出队首结点u,并且用u点当前的最短路径估计值对边(u,v)进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点加入队列。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。

判断有无负环:如果某个点进入队列的次数超过N/2次,则存在负环。平均来说O(kE),k为较小的常数。

但是可以被网格图和负权环卡到O(VE)

——wyh聚聚

2. Dijkstra

初始化: dis[v]=w[s,v];

其中,w[s,v]=maxint表示s到v无直接边

dis[s]=0; S={s}; //S表示已经拓展的点集

For i:=1 to n-1 do 从V-S中取出一个顶点u进行拓展,

  要求:dis[u]=min{dis[v]|v∈V-S} //此处也是算法的关键,s到u的最短路径d[u]已经不可能再小了。此处可以用堆优化。

  S=S+{u}

  For u连出的每一条边<u,v> do

    Relax(u,v)

不加堆优化O(V^2) 建议稠密图使用

加堆优化O(ElogE) 建议稀疏图使用

3. Floyd:这个实在太简单了,就不讲了,利用动态规划的思想,复杂度O(V^3),但是可以求所有点对之间的最短路径。

但是一般来说没有必要求那么多。

要求的话,一种用Floyd,O(V^3),一种用SPFA或Dijkstra,乘上V,SPFA O(kVE) Dijkstra O(V^3), 堆优化O(VElogE)

(= =)貌似也讲太多了。。

最小生成树

一个连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边。 对于连通的带权图G,其生成树也是带权的。 生成树上各边权值的总和,称为该树的权。 权值最小的生成树,称为G的最小生成树(MST,Minimum Spanning Tree)。 解决最小生成树问题一般有两种算法Prim和Kruskal。

1. PRIM

Prim算法基于一种贪心策略: 每次选取离当前点集最近的点加入MST。 多用于稠密图。 初始时,MST是只包含一个点的集合,由于每个点最终都要被包含在MST内,所以Prim算法可以由图中的任意一点开始。与djikstra很相似,具体在后面会详细更新。

2. KRUSKAL

同样,在以后的文章中也会详细介绍,敬请期待。。

时间: 2024-12-18 06:30:48

图论知识整理(2) 拓扑排序、最短路、最小生成树的相关文章

图论专题小结:拓扑排序

拓扑排序 拓扑排序是针对有向图进行的,拓扑排序有两个作用:(1)针对某种定义好的"小于"关系为结点排序:(2)判断一个有向图中是否存在有向环.我们可以利用DFS来完成拓扑排序. 下面是判断一个有向图g中是否含有有向环的代码: #define N 100+10 int c[N], g[N][N];//利用二维数组g保存有向图 int n;//结点数,下标从0开始 bool toposort(int u) { c[u] = -1;//正在访问 for (int v = 0; v <

算法系列(十三)图论基本概念和拓扑排序

图的定义 一个图G=(V,E),由定点的集合V,和边的集合E组成.每一条边都是一副点对(v,w),边也称作弧,边上可以有权值.如果点对是有序的,那么图就是有向的. 图中的一条路径是一个顶点序列w1,w2,w3......wN,如果图中包含一条从顶点到自身的边,那么这个路径就是环. 有向无环图也成为DAG 如果在一个无向图中每个顶点到其它顶点都存在路径,则称这个无向图是连通的.具有这样性质的有向图被称为是强连通的.如果一个有向图不是强连通的,但是去掉方向后的基础图是连通的,那么该有向图称为是弱连通

图论-拓扑排序详解

拓扑排序(topsort)详解 这篇随笔就信息学奥林匹克竞赛中图论的一个知识点--拓扑排序进行讲解.拓扑排序的内容比较基础,只要求读者学习过并了解信息学中图的相关定义和一些专业名词,但是拓扑排序的变形题目比较多,希望读者在看完本随笔后认真体会练习,掌握拓扑排序. 上课! 拓扑排序的定义 顾名思义,这是一种排序,确切地说,是一种图上排序,在一张有向无环图(注解:有向无环图即很多参考书和题解中所说的DAG)上进行排序,把其中的所有节点排成一个序列,使得图中的任意一对有边相连的节点(u,v)u要出现在

HDU[1285]确定比赛名次 拓扑排序

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285 题目大意:某人知道N个队伍M场比赛的胜负结果,要求输出N个队伍的名次(id为第二关键字). 核心思想:转化为图论问题,进行拓扑排序.步骤1.选定入度为0的点 2.删除该点与关联边 3.重复该过程 代码如下: //拓扑排序 (1.选入度为0的点.2.删除该点及关联边 3.重复该过程) #include <iostream> #include <memory.h> using nam

20151230训练题解(最短路+拓扑排序)

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=103223#problem/B 这道题用经典的dijsktra算法,大概思路就是用dist[x]存储x到已经确定集合的最短路,n次循环到这个这个最小值,然后更新其他点到新集合的最短路即对应的dist[] 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <al

BZOJ1880 SDOI2009 Elaxia的路线 最短路+拓扑排序

题意:给定两个点对和一张无向图,求两个点对的最短路中,重边边权和的最大值 题解: 首先从给出的四个点出发跑出到其他所有点的最短路,然后判断哪些边是重边.找出所有重边后,将其构有向图,在该图上用拓扑排序求最长路. 开始的时候枚举每一条边我没有建反向边,而是每次判定的时候互换一下边的始末点看是否合法,结果最后一个点死活过不去.后来上网搜题解才知道,必须建反向边,与原边分别判断.果然偷懒就是不行啊…… #include <cstdio> #include <cstring> #inclu

【差分约束系统】【强连通分量缩点】【拓扑排序】【DAG最短路】CDOJ1638 红藕香残玉簟秋,轻解罗裳,独上兰舟。

题意: 给定n个点(点权未知)和m条信息:u的权值>=v的权值+w 求点权的极小解和极大解(无解则输出-1) 极小解即每个点的点权可能的最小值 极大解即每个点的点权可能的最大值 题解: 差分约束系统 对于val[u]>=val[v]+w 要得到极小解,v是没有受限制的,其最小值为0 而u受到v的限制,显然,val[u]的最小值就是val[v]+w 在多条件限制下,我们用v连向u边权为w的边表示每个限制条件val[u]>=val[v]+w 那么如果得到的是拓扑图,则按拓扑序求到每个点的最长

ASC(22)C(最短路+双连通分量找桥或拓扑排序)

Important Roads Special JudgeTime Limit: 20000/10000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticNext Problem Problem Description The city where Georgie lives has n junctions some of which are connected by bidirectional r

POJ 3114 - Countries in War(强连通分量+缩点+拓扑排序+DAG最短路)

Countries in War Time Limit:1000MS    Memory Limit:65536KB    64bit IO Format:%I64d & %I64u Appoint description: Description In the year 2050, after different attempts of the UN to maintain peace in the world, the third world war broke out. The impor