拓扑排序

杂物 -- 拓扑排序 C++

[亡魂溺海] 提交于 2020-02-03 16:19:03
杂物 题目描述 John的农场在给奶牛挤奶前有很多杂务要完成,每一项杂务都需要一定的时间来完成它。比如:他们要将奶牛集合起来,将他们赶进牛棚,为奶牛清洗乳房以及一些其它工作。尽早将所有杂务完成是必要的,因为这样才有更多时间挤出更多的牛奶。当然,有些杂务必须在另一些杂务完成的情况下才能进行。比如:只有将奶牛赶进牛棚才能开始为它清洗乳房,还有在未给奶牛清洗乳房之前不能挤奶。我们把这些工作称为完成本项工作的准备工作。至少有一项杂务不要求有准备工作,这个可以最早着手完成的工作,标记为杂务1。John有需要完成的n个杂务的清单,并且这份清单是有一定顺序的,杂务k(k>1)的准备工作只可能在杂务1至k−1中。写一个程序从1到n读入每个杂务的工作说明。计算出所有杂务都被完成的最短时间。当然互相没有关系的杂务可以同时工作,并且,你可以假定John的农场有足够多的工人来同时完成任意多项任务。输入格式第1行:一个整数n,必须完成的杂务的数目(3≤n≤10,0003 );第2至(n+1)行: 共有n行,每行有一些用1个空格隔开的整数,分别表示:* 工作序号(1至n,在输入文件中是有序的);* 完成工作所需要的时间len(1≤len≤100);* 一些必须完成的准备工作,总数不超过100个,由一个数字0结束。有些杂务没有需要准备的工作只描述一个单独的0,整个输入文件中不会出现多余的空格。输出格式一个整数

算法题 拓扑排序-06-Reward

家住魔仙堡 提交于 2020-02-03 05:01:27
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<

算法题 拓扑排序-01-Harry and Magical Computer

China☆狼群 提交于 2020-02-02 03:46:51
In reward of being yearly outstanding magic student, Harry gets a magical computer. When the computer begins to deal with a process, it will work until the ending of the processes. One day the computer got n processes to deal with. We number the processes from 1 to n. However there are some dependencies between some processes. When there exists a dependencies (a, b), it means process b must be finished before process a. By knowing all the m dependencies, Harry wants to know if the computer can finish all the n processes. Input There are several test cases, you should process to the end of file

算法题 拓扑排序-02-Legal or Not

时光毁灭记忆、已成空白 提交于 2020-02-01 16:09:12
ACM-DIY is a large QQ group where many excellent acmers get together. It is so harmonious that just like a big family. Every day,many “holy cows” like HH, hh, AC, ZT, lcc, BF, Qinz and so on chat on-line to exchange their ideas. When someone has questions, many warm-hearted cows like Lost will come to help. Then the one being helped will call Lost “master”, and Lost will have a nice “prentice”. By and by, there are many pairs of “master and prentice”. But then problem occurs: there are too many masters and too many prentices, how can we know whether it is legal or not? We all know a master can

拓扑排序

爱⌒轻易说出口 提交于 2020-01-31 15:32:03
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。 在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological sorting): 每个顶点出现且只出现一次; 若A在序列中排在B的前面,则在图中不存在从B到A的路径。 from collections import defaultdict class Graph: def __init__(self,vertices): self.graph = defaultdict(list) self.V = vertices def addEdge(self,u,v): self.graph[u].append(v) def topologicalSortUtil(self,v,visited,stack): visited[v] = True for i in self.graph[v]: if visited[i] == False: self

数据结构课设——有向图的深度、广度优先遍历及拓扑排序

吃可爱长大的小学妹 提交于 2020-01-30 22:19:33
任务:给定一个有向图,实现图的深度优先, 广度优先遍历算法,拓扑有序序列,并输出相关结果。 功能要求:输入图的基本信息,并建立图存储结构(有相应提示),输出遍历序列,然后进行拓扑排序,并测试该图是否为有向无环图,并输出拓扑序列。 按照惯例,先上代码,注释超详细: #include<stdio.h> #include<stdlib.h> #include<malloc.h> #pragma warning(disable:4996) #define Max 20//定义数组元素最大个数(顶点最大个数) typedef struct node//边表结点 { int adjvex;//该边所指向结点对应的下标 struct node* next;//该边所指向下一个结点的指针 }eNode; typedef struct headnode//顶点表结点 { int in;//顶点入度 char vertex;//顶点数据 eNode* firstedge;//指向第一条边的指针,边表头指针 }hNode; typedef struct//邻接表(图) { hNode adjlist[Max];//以数组的形式存储 int n, e;//顶点数,边数 }linkG; //以邻接表的存储结构创建图 linkG* creat(linkG* g) { int i, k; eNode* s;/

P3573-[POI2014]RAJ-Rally【拓扑排序,二分+树状数组】

情到浓时终转凉″ 提交于 2020-01-30 17:56:19
正题 题目链接: https://www.luogu.com.cn/problem/P3573 题目大意 n n n 个点 m m m 条边的 D A G DAG D A G ,删掉一个点使得最长路最短。 解题思路 先跑一遍拓扑排序 d s i ds_i d s i ​ 表示以 i i i 结尾的最长路, d t i dt_i d t i ​ 表示以 i i i 开头的最长路,用拓扑序+dp可以搞定 定义两个点集 S S S 和 T T T ,我们先将所有所有点放入 T T T 集合,并且把 d t dt d t 放入一个数据结构里。 然后按照拓扑序枚举从小到大删除哪个点,枚举到的点 x x x 我们把 d t x dt_x d t x ​ 从数据结构里删除,对于 y − > x y->x y − > x 我们可以把 d s y + d t x + 1 ds_y+dt_x+1 d s y ​ + d t x ​ + 1 从数据结构里删除。 然后查询最小值统计答案 之后把 d s x ds_x d s x ​ 和对于 x − > y x->y x − > y 我们有 d s x + d t y + 1 ds_x+dt_y+1 d s x ​ + d t y ​ + 1 都丢进数据结构里。 这里用树状数组+二分统计答案。 时间复杂度 O ( n log ⁡ 2 n ) O(n\log

AOV网络、AOE网络(拓扑排序)

岁酱吖の 提交于 2020-01-30 00:44:22
判断是否可构成AOV网络,即是否存在拓扑序列 #include <cstdio> #include <cstring> #include <queue> using namespace std; int n, m; vector <int> p[110]; int inde[110]; int tp(){ queue<int> Q; int i, j; for(i = 0; i < n; i++) if(!inde[i]) Q.push(i); int t, cont = 0; while(!Q.empty()){ t = Q.front(); cont++; Q.pop(); for(i = 0; i <p[t].size(); i++){ inde[p[t][i]]--; if(!inde[p[t][i]]) Q.push(p[t][i]); } } if(cont < n) return 0; return 1; } int main(){ int i, j, a, b; while(~scanf("%d %d", &n, &m) && n){ memset(p, 0, sizeof(p)); memset(inde, 0, sizeof(inde)); for(i = 1; i <= m; i++){ scanf("%d %d", &a, &b); p[a].push

HihoCoder-1174拓扑排序

梦想与她 提交于 2020-01-29 07:06:11
描述 由于今天上课的老师讲的特别无聊,小Hi和小Ho偷偷地聊了起来。 小Ho:小Hi,你这学期有选什么课么? 小Hi:挺多的,比如XXX1,XXX2还有XXX3。本来想选YYY2的,但是好像没有先选过YYY1,不能选YYY2。 小Ho:先修课程真是个麻烦的东西呢。 小Hi:没错呢。好多课程都有先修课程,每次选课之前都得先查查有没有先修。教务公布的先修课程记录都是好多年前的,不但有重复的信息,好像很多都不正确了。 小Ho:课程太多了,教务也没法整理吧。他们也没法一个一个确认有没有写错。 小Hi:这不正是轮到小Ho你出马的时候了么! 小Ho:哎?? 我们都知道大学的课程是可以自己选择的,每一个学期可以自由选择打算学习的课程。唯一限制我们选课是一些课程之间的顺序关系:有的难度很大的课程可能会有一些前置课程的要求。比如课程A是课程B的前置课程,则要求先学习完A课程,才可以选择B课程。大学的教务收集了所有课程的顺序关系,但由于系统故障,可能有一些信息出现了错误。现在小Ho把信息都告诉你,请你帮小Ho判断一下这些信息是否有误。错误的信息主要是指出现了"课程A是课程B的前置课程,同时课程B也是课程A的前置课程"这样的情况。当然"课程A是课程B的前置课程,课程B是课程C的前置课程,课程C是课程A的前置课程"这类也是错误的。 输入 第1行:1个整数T,表示数据的组数T(1 <= T <= 5)

Codeforces Round #290 (Div. 2), problem: (C) Fox And Names 【BFS+无前驱的顶点优先+拓扑排序】

[亡魂溺海] 提交于 2020-01-28 17:55:45
题意 有N个字符串,要求你给出一个字典序,使它们按字典序排序后的结果和输入顺序一样。 思路 显然对于一个字符串i优先于字符串j,i的第一个和j不同的字母优于j的对应的字母。(若找不到该字母,即i是j的前面一部分则可以直接判断无解) 那么我们可以得到很多对字母之间的优先顺序,要给出26个字母的优先顺序,无非就是拓扑排序。 采用无前驱的顶点优先BFS的拓扑排序,如果存在没有被拓扑排序所排序到的节点,那么无解(即有环)。 发现没有特殊情况。 因为点少,用邻接矩阵建图。 code #include < bits / stdc ++ . h > #define endl '\n' using namespace std ; const int maxn = 110 ; int n ; queue < int > q ; char s [ maxn ] [ maxn ] , ans [ maxn ] ; bool link [ 30 ] [ 30 ] ; int in [ maxn ] ; //无前驱的顶点优先bfs bool bfs ( ) { int cnt = 0 ; for ( int i = 0 ; i < 26 ; i ++ ) { if ( in [ i ] == 0 ) { //先将入度为0的结点入队列 q . push ( i ) ; ans [ cnt ++ ] = 'a'