拓扑排序

图综合练习--拓扑排序

大憨熊 提交于 2019-12-23 03:59:40
图综合练习–拓扑排序 题目描述 已知有向图,顶点从0开始编号,求它的求拓扑有序序列。 拓扑排序算法:给出有向图邻接矩阵 1.逐列扫描矩阵,找出入度为0且编号最小的顶点v 2.输出v,并标识v已访问 3.把矩阵第v行全清0 重复上述步骤,直到所有顶点输出为止 –程序要求– 若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio 程序中若include多过一个头文件,不看代码,作0分处理 不允许使用第三方对象或函数实现本题的要求 输入 第一行输入一个整数t,表示有t个有向图 第二行输入n,表示图有n个顶点 第三行起,输入n行整数,表示图对应的邻接矩阵 以此类推输入下一个图的顶点数和邻接矩阵 输出 每行输出一个图的拓扑有序序列 样例输入 2 5 0 1 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 样例输出 0 1 3 2 4 4 6 5 1 3 2 0 #include <iostream> using namespace std; class Graph{ int vexNum; int

第7章 AOE网与关键路径

纵饮孤独 提交于 2019-12-20 11:24:19
【AOE网】 【概念】 与AOV网相对应的是 边表示活动的有向无环图 AOE(Activity On Edge) ,如下图所示。 图中 顶点表示事件(Event) ,每个事件表示在其前的所有活动已经完成,其后的活动可以开始; 弧表示活动 ,弧上的权值表示相应活动所需的时间或费用。 与AOE有关的研究问题: 完成整个工程至少需要多少时间? 哪些活动是影响工程进度(费用)的关键? 【定义】 设 v 0 v_0 v 0 ​ 是起点,从 v 0 v_0 v 0 ​ 到 v i v_i v i ​ 的最长路径长度称为事件 v i v_i v i ​ 的最早发生时间,即是以 v i v_i v i ​ 为尾的所有活动的最早发生时间。 若活动 a i a_i a i ​ 是弧 < j , k > <j, k> < j , k > ,持续时间是 d u t ( < j , k > ) dut(<j, k>) d u t ( < j , k > ) ,设: ◆ e ( i ) e(i) e ( i ) :表示活动 a i a_i a i ​ 的最早开始时间。 ◆ l ( i ) l(i) l ( i ) :在不影响进度的前提下,表示活动 a i a_i a i ​ 的最晚开始时间。则 l ( i ) − e ( i ) l(i)-e(i) l ( i ) − e ( i ) 表示活动 a i a_i

拓扑排序

北战南征 提交于 2019-12-20 09:48:32
拓扑排序 一.定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。 通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。 注意: 1)只有有向无环图才存在拓扑序列; 2)对于一个DAG,可能存在多个拓扑序列; 如: 该DAG的拓扑序列为A B C D或者A C B D 而此有向图是不存在拓扑序列的,因为图中存在环路 二.拓扑序列算法思想 (1)从有向图中选取一个没有前驱(即入度为0)的顶点,并输出之; (2)从有向图中删去此顶点以及所有以它为尾的弧; 重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。 三.代码实现 采用邻接矩阵实现,map[i][j]=0,表示节点i和j没有关联;map[i][j]=1,表示存在边<i,j>,并且j的入度加1; #include<iostream> #include<stdlib.h> #include<stdio.h> #define MAX 100 usingnamespace std; void toposort(int map[MAX][MAX],int indegree[MAX],int n) { int i,j,k; for

图基本算法 拓扑排序(基于dfs)

ぐ巨炮叔叔 提交于 2019-12-19 12:54:26
  拓扑排序,是对有向无回路图进行排序,以期找到一个线性序列,这个线性序列在生活正可以表示某些事情完成的相应顺序。如果说所求的图有回路的话,则不可能找到这个序列。   在大学数据结构课上,我们知道求拓扑排序的一种方法。首先用一个入度数组保存每个顶点的入度。在进行拓扑排序时,我们需要找到入度为0的点,将其存入线性序列中,再将其从图中删除(与它相关的边都删除,相邻的顶点的入度均减1),再重复上面的操作,直至所有的顶点都被找到为止。如果不对每次找入度为0的顶点的方法进行处理,而直接去遍历入度数组,则该算法的时间复杂度为O(|V| 2 ),如果使用一个队列来保存入度为0的顶点,则可以将这个算法的复杂度降为O(V+E)。   今天在算法导论上看了用dfs来求拓扑排序的算法,才发现其高深之处,膜拜之Orz… 下面是算法导论的叙述:   本节说明了如何运用深度优先搜索,对一个有向无回路图(dag)进行拓扑排序。对有向无回路图G=(V,E)进行拓扑排序后, 结果为该图顶点的一个线性序列 ,满足如果G包含边(u, v),则在该序列中,u就出现在v的前面(如果图是有回路的,就不可能存在这样的线性序列)。一个图的拓扑排序可以看成是图中所有顶点沿水平线排列而成的一个序列。使得所有的有向边均从左指向右。因此,拓扑排序不同于通常意义上的排序。 在很多应用中,有向无回路图用于说明时间发生的先后次序

【Codeforces Round #460 (Div. 2) D】Substring

点点圈 提交于 2019-12-19 01:54:43
【链接】 我是链接,点我呀:) 【题意】 在这里输入题意 【题解】 如果有环 ->直接输出-1 (拓扑排序如果存在某个点没有入过队列,说明有环->即入队的节点个数不等于n 否则。 说明可以做拓扑排序。 ->是一个有向无环图。 那么定义f[x][y] 表示x节点前面的某条路径中,字母y出现的最多次数是多少次。 在拓扑排序的时候做DP就好。 (可以百度:有向无环图 DP 应该有挺多类似的题的 从入度为0的点开始进行DP。 然后遇到分叉的时候也没关系 取两条路中对应字母的较大值就好。 所以最后f[x][y]中不同字母的最大值可能就是不同的路径了。 (是哪一条不好说 然后显然你尽可能地多走一点路总是没错的。 (走过的点越多,字母出现的频率越高。 所以肯定是从一个端点到达另外一个端点。 (即从入度为0的端点开始走. 【代码】 #include <bits/stdc++.h> using namespace std; const int N = 3e5; int n,m,k,flag[N+10],now,dp[N+10][30]; char s[N+10]; vector<int> g[N+10]; int ru[N+10],a[N+10]; queue<int> dl; int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", "r",

拓扑排序

扶醉桌前 提交于 2019-12-18 21:14:25
【0】README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在理解 拓扑排序的思想并用源代码加以实现; 0.2) 图论算法基础知识,参见 http://blog.csdn.net/pacosonswjtu/article/details/49893715 【1】拓扑排序(有向无圈图才有资格谈拓扑排序,有向且要无圈) 1.1)拓扑排序定义: 拓扑排序是对有向无圈图的顶点的一种排序, 它使得如果存在一条从 vi 到 vj的路径,那么在排序中 vj出现在 vi的后面;(有向无圈图:一个有向图没有圈, 圈:满足w1=wn 且长度至少为1个一条路径) 1.2)拓扑排序应用(有点像联机算法): 课程选修顺序, 如有向边(v, w)表明课程v 必须在课程w 选修前修完;(显然,如果图含有圈, 那么拓扑排序是不可能的) 1.3)一个简单的求拓扑排序的算法是: 先找出任意一个没有入边的顶点。 然后我们显示出该顶点,并将它和他的边一起从图中删除; 1.4)改进后的求拓扑排序的算法: 1.4.1)算法描述: 通过将所有入度为0 的顶点放在一个特殊的盒子中而避免这种无效的劳动。此时 FindNewVertexOfIndegreeZero 函数返回(并删除)盒子中的 任一顶点。当我们降低这些邻接顶点的入度时,检查每一个顶点并在它的入度 降为0 时把它放入盒子中; 1.4.2)实现盒子

数据结构图的拓扑排序总结

微笑、不失礼 提交于 2019-12-18 15:12:23
图 在数学中,一个图(Graph)是表示物件与物件之间的关系的数学对象,是图论的基本研究对象。 图是十分重要的数据结构,常常被应用于实际生活的应用之中。生活中常见的问题例如交通路线图、任务指定分配、工期计算、航空网络等,都可以使用图相关的理论来建立模型。 下面是《数据结构与算法分析》对图的若干定义 一个图(Graph)G = (V, E)由顶点(vertex)集和边(Edge)集E组成。每一条边就是一个点对(v,w),其中v,w属于集合V。有时也把边Edge叫做弧(arc)。如果点对是有序的,那么图就叫做是有序的(directed)。有向的图有时候叫做有向图。顶点v和w邻接(adjacent)当且仅当(v,w)属于E。在一个具有边(v,w)从而具有边(w,v)的无向图中,w和v邻接且v和w也邻接。有时候边还具有第三种成分,叫做权(weight)或值(cost)。 图的存储 一种简单存储图的方式时采用一个被称为邻接矩阵的二维数组 a[i][j] ,数组的大小为 n * n , n 为图的顶点个数。其中如果顶点i到顶点j连通,那么 a[i][j] = 1 ,否则 a[i][j] = 0 。这种存储方式的优点是简单直观,实现方便。缺点也很明显,所需要的存储空间巨大。 当含有n个顶点的图G中大多数顶点都不是连通,那么意味中 n * n 邻接矩阵中有大量的元素为0,即此时邻接矩阵是稀疏矩阵。

leetcode【高级】 课程表 Java

ⅰ亾dé卋堺 提交于 2019-12-16 23:14:10
题干 现在你总共有 n 门课需要选,记为 0 到 n-1。 在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] 给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习? 示例 1: 输入 : 2 , [ [ 1 , 0 ] ] 输出 : true 解释 : 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。所以这是可能的。 示例 2: 输入 : 2 , [ [ 1 , 0 ] , [ 0 , 1 ] ] 输出 : false 解释 : 总共有 2 门课程。学习课程 1 之前,你需要先完成​课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。 说明: 输入的先决条件是由边缘列表表示的图形,而不是邻接矩阵。详情请参见图的表示法。 你可以假定输入的先决条件中没有重复的边。 提示: 这个问题相当于查找一个循环是否存在于有向图中。如果存在循环,则不存在拓扑排序,因此不可能选取所有课程进行学习。 通过 DFS 进行拓扑排序 - 一个关于Coursera的精彩视频教程(21分钟),介绍拓扑排序的基本概念。 拓扑排序也可以通过 BFS 完成。 想法 今天的题需要了解拓扑排序,如果它是一个拓扑排序,即没环就可。 代码思路可以参考 传送门 Java代码 public class

拓扑排序的实现_TopoSort

落爺英雄遲暮 提交于 2019-12-16 20:22:55
拓扑排序是求一个AOV网(顶点代表活动, 各条边表示活动之间的率先关系的有向图)中各活动的一个拓扑序列的运算, 可用于測试AOV 网络的可行性. 整个算法包含三步: 1.计算每一个顶点的入度, 存入InDegree数组中. 2.检查InDegree数组中顶点的入度, 将入度为零的顶点进栈. 3.不断从栈中弹出入度为0的顶点并输出, 并将该顶点为尾的全部邻接点的入度减1, 若此时某个邻接点的入度为0, 便领其进栈. 反复步骤 3, 直到栈为空时为止. 此时, 或者所有顶点都已列出, 或者因图中包括有向回路, 顶点未能所有列出. 实现代码: #include "iostream" #include "cstdio" #include "cstring" #include "algorithm" #include "queue" #include "stack" #include "cmath" #include "utility" #include "map" #include "set" #include "vector" #include "list" #include "string" using namespace std; typedef long long ll; const int MOD = 1e9 + 7; const int INF = 0x3f3f3f3f;

POJ 1094差分约束系统拓扑排序

ⅰ亾dé卋堺 提交于 2019-12-16 17:49:47
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 32933 Accepted: 11445 Description An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not. Input Input consists of multiple problem instances. Each instance starts with a line containing two