首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

图算法-LeetCode 133、207(拓扑排序,邻接表建立)

tmp_copy的邻居数组中。...这是不可能的。 说明: 输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。 你可以假定输入的先决条件中没有重复的边。...一个很简单的思路是使用拓扑排序算法,可以判断一个循环是否存在于一个有向图中。...拓扑排序算法:计算图中所有节点的入度,如果某些节点的入度为零,则压入到队列todo中,接着循环弹出队列中的节点(即入读为零的节点),同时将下一个节点中入度为零的节点压入队列中,如果最后图都可以分离开,也就在此过程中...C++代码(拓扑排序): bool canFinish(int numCourses, vector>& prerequisites) { std::unordered_map

1.2K20

BZOJ4484: 最小表示(拓扑排序乱搞+bitset)

Description 【故事背景】 还记得去年JYY所研究的强连通分量的问题吗?去年的题目里,JYY研究了对于有向图的“加边”问题。对于图论有着强烈兴趣的JYY,今年又琢磨起了“删边”的问题。...为了简化一下大家的工作量,这次JYY保证他给定的有向图一定是一个有向无环图(JYY:大家经过去年的问题,都知道对于给任意有向图的问题,最后都能转化为有向无环图上的问题,所以今年JYY就干脆简化一下大家的工作...接下来M行,每行包含两个1到N之间的正整数 ,表示图中存在一条从 的有向边。 输入数据保证,任意两点间只会有至多一条边存在。...N<=30,000,M<=100,000 Output 输出一行包含一个整数,表示JYY最多可以删掉的边数。...首先,一条边(u,v)可以删除的条件为:删除这条边后,仍然能从u走到v 这样的话我们可以贪心处理,对于两个点(u,v),我们保留其最长的路径,其余的全部删去 具体实现的时候我们可以先来一边拓扑排序,同时记录下每个点出现的时间

587100
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    课程表(拓扑排序)

    例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1] 给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?...所以这是可能的。 示例 2: 输入: 2, [[1,0],[0,1]] 输出: false 解释: 总共有 2 门课程。...这是不可能的。 提示: 输入的先决条件是由 边缘列表 表示的图形,而不是 邻接矩阵 。详情请参见图的表示法。 你可以假定输入的先决条件中没有重复的边。...解题 参考:图Graph–拓扑排序(Topological Sorting) 2.1 广度优先 找到入度为0的先开始学习,入队 跟其连接的节点,入度-1,入度为零时,可以入队 返回所有节点是否都入队了即可...q.empty()) { tp = q.front();//tp完成了,依赖其的,入度都-1 finish++; q.pop(); for(auto id : m[tp])

    53930

    图的遍历(下)——邻接表

    概述 在我的上一篇博客:图的遍历(上)——邻接矩阵 中主要介绍了邻接矩阵的BFS和递归的DFS与非递归的DFS这3种遍历算法。在这篇博客我将主要叙述邻接表的以上3中遍历算法。...首先来看看邻接表的表示方法。 邻接表主要是针对稀疏图中邻接矩阵造成的空间浪费而提出的。下面我们来看看邻接表的表示。 1)无向图的表示 ? 2)有向图 ?...(说明:对于BFS,DFS的递归与非递归算法在这篇文章就不再重复,如有不了解请移步我的上一篇博客:图的遍历(上)——邻接矩阵 ) ---- 广度优先遍历(BFS) //广度优先遍历(BFS) void...return this->next; } }; class Graph{ private: vector Edgelist; //邻接表...{ cout<<"请输入顶点数与边数:"<<endl; int nv,ne; cin>>nv>>ne; Graph graph(nv,ne); cout邻接表为

    91410

    图的遍历(上)——邻接矩阵表示

    概述 图作为数据结构书中较为复杂的数据结构,对于图的存储方式分邻接矩阵和邻接表两种方式。在这篇博客中,主要讲述邻接矩阵下的图的深度优先遍历(DFS)与广度优先遍历(BFS)。...---- 广度优先遍历(BFS) BFS 算法的思想是:对一个无向连通图,在访问图中某一起始顶点 v 后,由 v 出发,依次访问 v 的所有未访问过的邻接顶点 w1, w2, w3, …wt;然后再顺序访问...w1, w2, w3, …wt 的所有还未访问过的邻接顶点;再从这些访问过的顶点出发,再访问它们的所有还未访问过的邻接顶点,……,如此直到图中所有顶点都被访问到为止。...1 for(int i = 1 ; i Nv ; i++){ //依次递归遍历当前结点的未被访问的邻接点 if(this->G[vertex...1 for(int i = 1 ; i Nv ; i++){ //依次递归遍历当前结点的未被访问的邻接点

    96520

    课程表 II(拓扑排序)

    例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。...因此,正确的课程顺序为 [0,1] 。...因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。 说明: 输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。...你可以假定输入的先决条件中没有重复的边。 提示: 这个问题相当于查找一个循环是否存在于有向图中。 如果存在循环,则不存在拓扑排序,因此不可能选取所有课程进行学习。...解题 参考:图Graph–拓扑排序(Topological Sorting) 本题跟 207 题完全一致,只是增加了路径输出。

    43220

    【图解】拓扑排序(210. 课程表 II)

    思路 这是一个典型的拓扑排序题目, 对拓扑排序不熟悉的,可以看下这个文章 - 揭开「拓扑排序」的神秘面纱,可以说讲的非常详细了。 Ok,我们回到这道题。...以题目例2来说: 由于题目本身课程的依赖关系是这么给我们的:[[1,0],[2,0],[3,1],[3,2]] 这种数据格式我们不方便直接使用, 因此我们将其改造成图的一种表示方式邻接矩阵。 ?...image.png 可以看到我们浪费了很多空间,这就是邻接矩阵的坏处, 而实际上对于这道题来说,没有必要真的搞一个邻接矩阵,比如这样就行了: ? image.png 可以看出空间复杂度要更好一点。...而对于visited,我们使用三色标记法,即没有访问的,访问过但是没有访问完毕的以及完全访问完毕的标记不同颜色。在这里我用0表示没有访问过,1表示访问过但是没有访问完毕,2访问完毕。...res了 res.append(i) return True 关键点 拓扑排序 三色标记 代码 class Solution: def findOrder(self, numCourses

    60410

    【python-leetcode207-拓扑排序】课程表

    例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1] 给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?...这是不可能的。 提示: 输入的先决条件是由 边缘列表 表示的图形,而不是 邻接矩阵 。详情请参见图的表示法。 你可以假定输入的先决条件中没有重复的边。...对于[1,0]:意思是要想学1课程,必须先学完0课程,以有向图表示就是0->1,以此类推。接下来记录每一个课程的入度,由于有0->1,因此1课程的入度加1。...当 flag[i] == 1,说明在本轮 DFS 搜索中节点 i 被第 2 次访问,即 课程安排图有环 ,直接返回 False。...(2)将当前访问节点 i 对应 flag[i] 置 1,即标记其被本轮 DFS 访问过; (3)递归访问当前节点 i 的所有邻接节点 j,当发现环直接返回 False; (4)当前节点所有邻接节点已被遍历

    45030

    【python-leetcode210-拓扑排序】课程表Ⅱ

    例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。...可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。 示例 1: 输入: 2, [[1,0]] 输出: [0,1] 解释: 总共有 2 门课程。...因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。 说明: 输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。...你可以假定输入的先决条件中没有重复的边。 提示: 这个问题相当于查找一个循环是否存在于有向图中。如果存在循环,则不存在拓扑排序,因此不可能选取所有课程进行学习。...有了之前课程表1的解法:https://www.cnblogs.com/xiximayou/p/12613820.html 这里只需要记录结果就行了:需要注意的是,不仅需要判断是否能够学完所有课程,还要保存线所学课程的顺序

    55320

    课程表---拓扑排序篇一

    课程表题解集合 引言 拓扑排序----BFS DFS ---- 引言 本题涉及到了拓扑排序相关的概念,如果对拓扑排序不了解的,建议看这篇文章AOV网与拓扑排序 ---- 拓扑排序----BFS 图解...: 拓扑排序实际上应用的是贪心算法。...具体到拓扑排序,每一次都从图中删除没有前驱的顶点,这里并不需要真正的做删除操作,我们可以设置一个入度数组,每一轮都输出入度为 0 的结点,并移除它、修改它指向的结点的入度(−1即可),依次得到的结点序列就是拓扑排序的结点序列...如果图中还有结点没有被移除,则说明“不能完成所有课程的学习”。 拓扑排序保证了每个活动(在这题中是“课程”)的所有前驱活动都排在该活动的前面,并且可以完成所有活动。拓扑排序的结果不唯一。...拓扑排序还可以用于检测一个有向图是否有环。相关的概念还有 AOV 网,这里就不展开了。 算法流程: 1、在开始排序前,扫描对应的存储空间(使用邻接表),将入度为 0 的结点放入队列。

    62040

    图的应用——拓扑排序

    AOV网(Activity On Vertices) 在一个表示工程的有向图中,用顶点表示活动,用有向边表示活动Vi 必须先于活动Vj 进行。...这种有向图叫做顶点表示活动的AOV网络 。 AOV网特点: AOV网中的弧表示活动之间存在的某种制约关系 AOV网中不能出现回路 算法思想 输入AOV网络。令 n 为顶点个数。...在AOV网络中选一个没有直接前驱的顶点, 并输出之; 从图中删去该顶点, 同时删去所有它发出的有向边; 重复以上 2、3 步, 直到: - 全部顶点均已输出,拓扑有序序列形成,拓扑排序完成;或:...[在这里插入图片描述] 算法实现 为避免每次都要搜索入度为零的顶点,在算法中设置一个“栈”,以保存“入度为零”的顶点。...NULL){ indegree[p->adjvex]++; p = p->nextarc; } } } void TopologicalSort(ALGraph G){ // 拓扑排序

    45686

    数据结构 图的邻接表

    大家好,又见面了,我是你们的朋友全栈君。 呃,下面该写邻接表了……. 邻接表的出现是因为图若是稀疏图,用邻接矩阵会造成空间的浪费,毕竟你要开辟一个一维数组和一个二维数组嘛,而且还是大开小用的那种。...邻接表为了避免内存的浪费引入了链式存储,它的处理办法是: 1.用一个一维数组存储顶点,当然你也可以用单链表存储, 2.用单链表存储顶点的邻接点,可以将顶点改为结构体数组,结构体中存放邻接点的指针,邻接点也创建一个结构体...下面是一个无向的网图: 邻接表中数据的存储图示如下(emmm,无向图果然没有有向图好画): emmm,终于画完了,我来介绍下这个图 顶点表也就是个结构体数组,是存放顶点的结构,顶点表中有data元素...边表也是一个结构体,内有adivex元素,存放邻接点的下标,weight存放顶点与邻接点之间线的权重,next是边表结构体指针,存放该顶点的下一个邻接点,next就是负责将顶点的邻接点连起来。...numarc; //当前邻接表的边数 }GraphAdjList; //建立图的邻接表 void CreateAdjListGraph(GraphAdjList &G) { ArcNode

    1.1K20

    有向图的拓扑排序

    拓扑排序是可以用图模拟的另一种操作方式。 他可用于表示一种情况,即某些项目或事件必须按照某种顺序排列发生。...* 有向图的拓补排序 * 步骤1、找到一个没有后继的顶点 * 步骤2、从图中删除这个顶点,在列表的前面插入顶点标记 */ public class TopoApp { //测试...theGraph.addEdge(5, 7);//FH theGraph.addEdge(6, 7);//GH theGraph.topo(); } } /** * 有一种拓扑图是拓扑排序是做不到的...* 1、调用noSuccessor找到任意一个没有后继的顶点 * 2、如果找到这样一个顶点把它放到数组sortedArray中,并且从图中删除 * 3、如果没有这样的顶点则,则此图必然存在环 *...同样的,顶点的行列从邻接矩阵中删除 * 下面的行和右面的列移动来填补空位。

    1.2K20

    揭开「拓扑排序」的神秘面纱

    拓扑排序 那么这么一个图的「拓扑序」是什么意思呢? 我们借用百度百科[1]的这个课程表来说明。...那么这个例子中拓扑排序的意思就是: 就是求解一种可行的顺序,能够让我把所有课都学了。 那怎么做呢?...而拓扑排序最重要的应用就是关键路径问题,这个问题对应的是 AOE (Activity on Edge) 网络。 AOE 网络:顶点表示事件,边表示活动,边上的权重来表示活动所需要的时间。...AOV 网络:顶点表示活动,边表示活动之间的依赖关系。 在 AOE 网中,从起点到终点具有最大长度的路径称为关键路径,在关键路径上的活动称为关键活动。...v=x3mm5a_CwRM&t=144s [4] 拓扑排序在工程中的应用: https://www.zhihu.com/question/39748146 部分图片来源于网络,版权归原作者,侵删。

    48720

    Python算法——树的拓扑排序

    Python中的树的拓扑排序 拓扑排序是一种对有向无环图(DAG)进行排序的算法。在树结构中,树是一种特殊的有向无环图,因此我们可以将拓扑排序应用于树的节点。...拓扑排序算法 拓扑排序算法通常使用深度优先搜索(DFS)来实现。基本思想是从根节点开始,依次访问每个节点,并将节点加入结果列表。在访问节点时,递归地遍历其子节点。...result = topological_sort(root) print("拓扑排序结果:", result) 输出结果: 拓扑排序结果: [4, 5, 2, 6, 3, 1] 这表示在给定的树结构中...,按照拓扑排序的顺序,结果列表中的节点顺序满足树的依赖关系。...拓扑排序常用于处理依赖关系图,确保在有依赖关系的任务中,先完成没有依赖的任务,再完成有依赖的任务。通过理解算法的原理和实现,您将能够更好地处理树结构问题。

    29510

    iOS算法——图的拓扑排序

    AOV网中的弧表示活动之间存在的某种制约关系,比如上面说到将大象装入冰箱,必须先打开冰箱门,才能将大象装进去,大象装进去才能关上冰箱门,从而完成我们的任务。...1.5 什么是拓扑排序呢? 所谓的拓扑排序,其实就是对一个有向无环图构造拓扑序列的过程。...3.3 AOV网的存储结构(邻接表) 使用AOV网来存储图信息 //边表结点 typedef struct EdgeNode { //邻接点域,存储该顶点对应的下标 int adjvex; //⽤...所以在求解关键路径之前, 我们需要调用⼀次拓扑排序的序列去计算etv和拓扑序列列表. etv计算公式推演, P[k]表示所有到达顶点Vk的弧的集合 当k=0时,etv[k]=0; 当k!...= stack[top--]; printf("%d -> ", GL->adjList[gettop].data); count++; //将弹出的顶点序号压入拓扑排序的栈中

    63910
    领券