拓扑排序

11、 拓扑排序

自闭症网瘾萝莉.ら 提交于 2020-03-09 00:38:42
1、 堆栈 栈是一种特殊的线性表,插入或删除栈元素的运算只能在表的一端进行,称运算的一端为栈顶,另一端称为栈底。队列也是一种特殊的线性表(基本操作都是线性操作的子集)。 特点:后进先出 栈又称为“后进先出”的线性表,简称LIFO表。 栈的链式实现是以链表作为栈的存储结构,并在这种存储结构上实现栈的基本运算。栈的链式实现称为链栈。 2、 有向无环图 描述含有公共子式的表达式的有效工具; 描述一项工程或系统的进行过程的有效工具。 3、 一些概念 通常我们把计划、施工过程、生产流程、程序流程等都当成一个工程,一个大的工程常常被划分成许多较小的子工程,这些子工程称为活动。这些活动完成时,整个工程也就完成了。 我们用一种有向图来表示这些工程、计划等,在这种有向图中,顶点表示活动,有向边表示活动的 优先关系 ,这种用顶点表示活动,用弧来表示活动间的优先关系的有向图叫做顶点表示活动的网络(Actire On Vertices)简称为AOV网。 拓扑排序: 假设G=(V,E)是一个具有n个顶点的有向图,V中顶点序列vl,v2,…,vn称做一个拓扑序列(TopologicalOrder),当且仅当该顶点序列满足下列条件:若在有向图G中存在从顶点vi到vj的一条路径,则在顶点序列中顶点vi必须排在顶点vj之前。通常,在AOV网中,将所有活动排列成一个拓扑序列的过程叫做拓扑排序(Topological

20200305之发现环 (拓扑排序 || 并查集+dfs)

有些话、适合烂在心里 提交于 2020-03-06 10:04:41
小明的实验室有N台电脑,编号1~N。原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。 不过在最近一次维护网络时,管理员误操作使得某两台电脑之间增加了一条数据链接,于是网络中出现了环路。环路上的电脑由于两两之间不再是只有一条路径,使得这些电脑上的数据传输出现了BUG。 为了恢复正常传输。小明需要找到所有在环路上的电脑,你能帮助他吗? 输入 第一行包含一个整数N。 以下N行每行两个整数a和b,表示a和b之间有一条数据链接相连。 对于30%的数据,1 <= N <= 1000 对于100%的数据, 1 <= N <= 100000, 1 <= a, b <= N 输入保证合法。 输出 按从小到大的顺序输出在环路上的电脑的编号,中间由一个空格分隔。 样例输入 5 1 2 3 1 2 4 2 5 5 3 样例输出 1 2 3 5 vectorq //申请了1个动态一维数组q vectorq[N] //申请了一个二维数组q,q的每个元素是一个一维数组 来源: CSDN 作者: 是IMI呀 链接: https://blog.csdn.net/weixin_45351699/article/details/104689342

拓扑排序

蓝咒 提交于 2020-03-04 18:05:10
# include <stdio.h> # include <stdlib.h> # include <string.h> # define MaxSize 20 typedef char VertexType ; typedef struct outNode { //定义出度的节点,边表 VertexType data ; struct outNode * next ; } outNode ; typedef struct Vertex { //定义顶点结构 int in ; VertexType data ; outNode * first ; } Vertex ; //用邻接表法创建AOV网 void CreateAOV ( Vertex * * g ) { VertexType ver ; int i = 0 ; int VertexNum ; outNode * p , * q ; ( * g ) = ( Vertex * ) malloc ( sizeof ( Vertex ) * MaxSize ) ; printf ( "请输入AOV网的顶点:\n" ) ; while ( '\n' != ( ver = getchar ( ) ) ) { //存储网的顶点信息 ( * g ) [ i ] . data = ver ; ( * g ) [ i ] . first =

HDU2647 Reward (拓扑排序、反向建图)

家住魔仙堡 提交于 2020-03-04 00:00:55
Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16933 Accepted Submission(s): 5431 Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to distribute rewards to his workers. Now he has a trouble about how to distribute the rewards. The workers will compare their rewards ,and some one may have demands of the distributing of rewards ,just like a's reward should more than b's.Dandelion's unclue wants to fulfill all the demands, of course ,he wants to use the least money.Every work's

[ZJOI2012]灾难(拓扑排序)

烂漫一生 提交于 2020-03-02 08:56:58
[ZJOI2012]灾难(luogu) Solution 由于没有环,可以看出食物网的分级结构,令生产者-初级消费者-...等级越来越高 对于每种生物,能使它灭绝的等级最低的生物至多有一种,为能使 每种吃它的生物 灭绝的等级最低的生物 可以建一棵灭绝树,树上每个节点的父亲即为能使它灭绝的等级最低的生物 求父亲即为求每种吃它的生物在灭绝树上对应的点的 LCA 可以看出求某个点的父亲时每种吃它的生物的父亲应已求出 在原食物网上跑一个拓扑,由于每种吃它的生物的拓扑排序必然在它前面,可以按这个顺序建树 为将森林化成树,将原食物网上所有入度为 0 的点的父亲指向 0 Code #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #include <queue> using namespace std; const int N=5e5+10; int ru[N],top[N]; int n,m,root,dep[N],fa[N][20],num,sum,si[N],d[N]; vector <int> l1[N],l2[N]; queue <int> q; int lca(int x,int y) { if(dep[x]>dep[y]) swap(x,y); for(int i=19;i>=0;i-

拓扑排序

这一生的挚爱 提交于 2020-03-01 20:25:34
1,定义 (1)AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称为AOV网。AOV网中的弧表示活动之间存在的某种制约更新。其中AOV网中不能存在回路。 (2)拓扑排序:对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。 例如 :设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,…,vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在vj之前,则我们称这样的顶点序列为一个拓扑序列。 说明 :所谓拓扑排序其实就是对一个有向图构造拓扑序列的过程。 2,拓扑排序算法 从AOV网中选择一个入度为0的顶点输出,然后删除此顶点,并删除以此顶点为尾的弧,重复操作指导输出全部顶点或者AOV网中不存在入度为0的顶点为止。 说明 :前面的最小生成树和最短路径都是使用的 邻接矩阵 ,由于拓扑排序过程需要删除顶点,所以我们使用 邻接表 会更加方便,而且需要在顶点表中加入入度域,我们会根据顶点的入度决定是否删除。 例如,我们将下面的AOV网转邻接表: 对于转换的实现,我们需要借助栈或者队列来实现,都可以。 3,拓扑排序代码实现 Status TopologicalSort ( AdjGraphList AG

C - Reward(拓扑排序)

…衆ロ難τιáo~ 提交于 2020-02-28 06:00:16
Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to distribute rewards to his workers. Now he has a trouble about how to distribute the rewards. The workers will compare their rewards ,and some one may have demands of the distributing of rewards ,just like a's reward should more than b's.Dandelion's unclue wants to fulfill all the demands, of course ,he wants to use the least money.Every work's reward will be at least 888 , because it's a lucky number. Input One line with two integers n and m ,stands for the number of works and the number of demands .(n<

Codeforces 510C (拓扑排序)

僤鯓⒐⒋嵵緔 提交于 2020-02-26 03:47:44
原题: http://codeforces.com/problemset/problem/510/C C. Fox And Names time limit per test:2 seconds memory limit per test:256 megabytes input:standard input output:standard output Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: the authors list on the paper is always sorted in the lexicographical order. After checking some examples, she found out that sometimes it wasn't true. On some papers authors' names weren't sorted in lexicographical order in normal sense. But it was always true that after some modification of the order

拓扑排序 ---- HDU 1285

喜欢而已 提交于 2020-02-25 18:56:51
代码如下; #include<iostream> #include<vector> #include<queue> #include<cstring> using namespace std; const int maxn = 1000; int in[maxn]; vector<int>V[maxn]; int main() { int n,m,x,y; while(cin>>n>>m){ memset(in,0,sizeof(in)); for(int i=1;i<=n;i++) V[i].clear(); while(m--) { cin>>x>>y; V[x].push_back(y);//构图 in[y]++;// 存入度 } priority_queue<int,vector<int>,greater<int> > q;// 优先数列,小的先出 for(int i=1;i<=n;i++) { if(in[i]==0) { q.push(i); } } int flag=1; while(!q.empty()) { int xx=q.top();q.pop(); if(flag) { cout<<xx; flag=0; } else cout<<" "<<xx; for(int i=0;i<(int)V[xx].size();i++) { in[V[xx][i]]--;

拓扑排序

做~自己de王妃 提交于 2020-02-25 11:41:48
在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件: 每个顶点出现且只出现一次。 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。 拓扑排序常用的两个方法 1、减治技术 从 DAG 图中选择一个 没有前驱(即入度为0)的顶点并输出。 从图中删除该顶点和所有以它为起点的有向边。 重复 1 和 2 直到当前的 DAG 图为空或当前图中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。 所以拓扑排序结果是1、2、4、3、5 通常,一个有向无环图可以有一个或多个拓扑排序序列。 2、基于DFS来实现 执行一次DFS遍历,并记住顶点变成死端(即退出遍历栈)的顺序,将该次序反过来就得到拓扑排序的一个解。当然在遍历时,不能遇到回边,如果遇到一条回边,该图就不是一个有向无环图,并且对它的顶点进行拓扑排序是不可能的。 当一个顶点v退出DFS栈时,在比v更早出栈的顶点中,不可能存在一个顶点u拥有一条边从u指向v,否则就构成了一个回边。所以在退栈次序的队列中,任何这样的顶点都会排在v的后面,并且在逆序中排在v的前面。 算法: (1)减治思想的程序