精华内容
下载资源
问答
  • 拓扑排序题目
    千次阅读
    2018-08-25 09:23:06

    转自:https://blog.csdn.net/liuqiyao_01/article/details/8478726

    【HDU】
    1285确定比赛名次
    2094产生冠军
    2647Reward
    3342Legal or Not
    1811Rank of Tetris  拓扑+并查集
    3231 Box Relations 三维拓扑

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

    【POJ】
    1094 Sorting It All Out  Floyd+拓扑
    2367 Genealogical tree
    3660 Cow Contest
    3687 Labeling Balls 神奇的拓扑
    1128Frame Stacking  DFS版拓扑
    1270Following Orders  拓扑+回溯
    1420Spreadsheet  模拟拓扑
    2762Going from u to v or from v to u?  强连通+拓扑

    3553 Task schedule

    更多相关内容
  • 拓扑排序题目

    2019-11-24 15:40:52
    1、题目描述 有时候,给出一些事物中的部分相对关系,就可以确定全部事物之间的关系。现在有n(2<= n <= 26)种事物,用大写字母'A'-'Z'来表示,现在给出这些事物中的部分事物之间的大小关系,例如n=4时有事物...

     

     

    1、题目描述

    有时候,给出一些事物中的部分相对关系,就可以确定全部事物之间的关系。现在有n(2<= n <= 26)种事物,用大写字母'A'-'Z'来表示,现在给出这些事物中的部分事物之间的大小关系,例如n=4时有事物A,B,C,D.并且给出关系A<B,B<C,C<D.就可以唯一确定A,B,C,D从小到大的序列:ABCD.

    解答要求:

    时间限制:1000ms,内存限制:64M

    输入:

    输入的第一行包含两个数字:n和m(1<= m <= 500),表示事物的数目和将要给出的关系数。接下来的m行,每行将给出这n个事物中的某两个事物的大小关系,用'<'连接。

    输出:

    1、如果这m个关系式中存在矛盾的关系,比如A<B,B<A,则输出 Inconsistency found after i relations. 表示第i个关系式首次出现了矛盾,并且不再判断后面的关系式。

    2、如果这m个关系式没有矛盾但是这些关系不能确定这n个事物的大小关系,就输出 Sorted sequence cannot be determined.

    3、如该得到i个关系式后就能唯一确定这n个事物的大小关系,就输出 Sorted sequence determined after i relations:XXX...XX. 并且不再判断后面的关系式。

     

    样例:

    4 6

    A<B

    A<C

    B<C

    C<D

    B<D

    A<B

    输出样例1:

    Sorted sequence determined after 4 relations:ABCD.

    提示:

    本题可以用拓扑排序来做。

     

    拓扑排序(Topological Sort)

    偏序(Partial Order)

    全序(Full Order)

    偏序指集合中仅有部分成员之间可以比较,而全序指集合中全体成员之间均可以比较。

     

    有向图:给定n个顶点和m条弧,就有三种情况:

    1. 能确定这n个顶点的唯一拓扑序列,即这n个顶点可以排列优先顺序,即图中的所以顶点之间均可以比较优先级
    2. 该有向图存在环,不能确定这n个顶点之间的优先顺序
    3. 该有向图无环,但这m个关系式(弧)还不足以唯一确定这n个顶点之间的优先关系。

     

     

    // Topo.cpp: 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    
    
    //https://blog.csdn.net/m0_37357063/article/details/103224795
    //1、题目描述
    //有时候,给出一些事物中的部分相对关系,就可以确定全部事物之间的关系。
    //现在有n(2<= n <= 26)种事物,用大写字母'A'-'Z'来表示,
    //现在给出这些事物中的部分事物之间的大小关系,
    //例如n=4时有事物A,B,C,D.并且给出关系A<B,B<C,C<D.
    //就可以唯一确定A,B,C,D从小到大的序列:ABCD.
    //解答要求:
    //时间限制:1000ms,内存限制:64M
    //输入:
    //输入的第一行包含两个数字:n和m(1<= m <= 500),表示事物的数目和将要给出的关系数。
    //接下来的m行,每行将给出这n个事物中的某两个事物的大小关系,用'<'连接。
    //输出:
    //1、如果这m个关系式中存在矛盾的关系,比如A<B,B<A,
    //则输出 Inconsistency found after i relations.
    //表示第i个关系式首次出现了矛盾,并且不再判断后面的关系式。
    
    //2、如果这m个关系式没有矛盾但是这些关系不能确定这n个事物的大小关系,
    //就输出 Sorted sequence cannot be determined.
    
    //3、如该得到i个关系式后就能唯一确定这n个事物的大小关系,
    //就输出 Sorted sequence determined after i relations:XXX...XX.
    //并且不再判断后面的关系式。
    
    //样例:
    
    //4 6
    
    //A<B
    
    //A<C
    
    //B<C
    
    //C<D
    
    //B<D
    
    //A<B
    
    //输出样例1:
    //Sorted sequence determined after 4 relations:ABCD.
    
    //提示:
    //本题可以用拓扑排序来做。
    //拓扑排序(Topological Sort)
    //偏序(Partial Order)
    //全序(Full Order)
    //偏序指集合中仅有部分成员之间可以比较,而全序指集合中全体成员之间均可以比较。
    //有向图:给定n个顶点和m条弧,就有三种情况:
    //能确定这n个顶点的唯一拓扑序列,即这n个顶点可以排列优先顺序,即图中的所以顶点之间均可以比较优先级
    //该有向图存在环,不能确定这n个顶点之间的优先顺序
    //该有向图无环,但这m个关系式(弧)还不足以唯一确定这n个顶点之间的优先关系。
    //————————————————
    //版权声明:本文为CSDN博主「珞喻小森林」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    //原文链接:https://blog.csdn.net/m0_37357063/article/details/103224795
    
    
    
    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct ArcNode {
    	int index;
    	struct ArcNode* next;
    }ArcNode;
    
    int main()
    {
    	int n, m;
    	scanf("%d %d", &n, &m);
    	int i;
    	char u,op,v;
    	ArcNode *temp = NULL;
    
    	//相较于malloc函数,calloc函数会自动将内存初始化为0;
    	ArcNode **headPtr = (ArcNode**)calloc(n + 1, sizeof(ArcNode*));
    	if (headPtr == NULL)
    	{
    		printf("calloc headPtr fail!\n");
    			return 1;
    	}
    	ArcNode **tailPtr = (ArcNode**)calloc(n + 1, sizeof(ArcNode*));
    	if (tailPtr == NULL)
    	{
    		printf("calloc tailPtr fail!\n");
    			return 1;
    	}
    
    	for (i = 1; i < n+1; i++)
    	{
    		temp = (ArcNode*)malloc(sizeof(ArcNode));
    		temp->index = -1;
    		temp->next = NULL;
    		headPtr[i] = temp;
    		tailPtr[i] = temp;
    	}
    
    	int *indegree = (int*)calloc(n + 1, sizeof(int));
    
    	int *zeroIndegreeStack = (int*)calloc(n, sizeof(int));
    	int zerotop = 0;
    
    	int *topoStack = (int*)calloc(n, sizeof(int));
    	int topotop = 0;
    
    	for (i = 0; i<m; i++)
    	{
    		scanf("%c%c%c", &u, &op, &v);
    		int idx_u = u - 'A' + 1;
    		int idx_v = v - 'A' + 1;
    		indegree[idx_v]++;
    
    		temp = (ArcNode*)malloc(sizeof(ArcNode));
    		temp->index = idx_v;
    		temp->next = NULL;
    
    		tailPtr[idx_u]->next = temp;
    		tailPtr[idx_u] = temp;
    	}
    
    	for (i = 1; i< n + 1; i++)
    	{
    		if (indegree[i] == 0)
    		{
    			zeroIndegreeStack[zerotop] = i;
    			zerotop++;
    		}
    	}
    	int zeroCount = 0;
    	for (i = 1; i< n + 1; i++)
    	{
    		if (indegree[i] == 0)
    		{
    			zeroCount++;
    		}
    	}
    	if (zeroCount > 1)
    	{
    		printf("Sorted sequence cannot be determined.\n");
    	}
    
    	int count = 0;
    	while (0 != zerotop)
    	{
    		zerotop--;
    		int index = zeroIndegreeStack[zerotop];
    		
    		topoStack[topotop] = index;
    		topotop++;
    		count++;
    
    		for (temp = headPtr[index]->next; temp != NULL; temp = temp->next)
    		{
    			int k = temp->index;
    			if ((--indegree[k]) == 0)
    			{
    				zeroIndegreeStack[zerotop] = k;
    				zerotop++;
    			}
    		}
    
    		indegree[index] = -1;
    
    		int zeroCount = 0;
    		for (i = 1; i< n + 1; i++)
    		{
    			if (indegree[i] == 0)
    			{
    				zeroCount++;
    			}
    		}
    		if (zeroCount > 1)
    		{
    			printf("Sorted sequence cannot be determined.\n");
    		}
    	}
    	if (count < n)
    	{
    		printf("Inconsistency found after i relations.\n");
    	}
    	else
    	{
    		printf("Sorted sequence determined after i relations:");
    		for (i = 0; i<topotop; i++)
    		{
    			printf("%c", topoStack[i] - 1 + 'A');
    		}
    		printf(".\n");
    	}
    
    
    	//for (int i = 0; i< n + 1; i++)
    	//{
    	//	free(headPtr[i]);
    	//	headPtr[i] = NULL;
    	//	free(tailPtr[i]);
    	//	headPtr[i] = NULL;
    	//}
    
    	//free(indegree);
    	//indegree = NULL;
    	//free(zeroIndegreeStack);
    	//zeroIndegreeStack = NULL;
    	//free(topoStack);
    	//topoStack = NULL;
    
    
    	system("pause");
    	return 0;
    }
    
    
    
    
    
    
    

     

     

     

    展开全文
  • C++拓扑排序题目

    2022-03-01 20:56:14
    学校里开设了n门课,其编号为0、1、2、……、n-1,但是有些课程需要完成其它课程才能学习。 小s是一个卷王,他不学完所有课程就不高兴。但是安排课程的老师犯了一些错误,导致有些课程可能不能学习。...
    卷王
    Time Limit: 2000 MSMemory Limit: 1000 KB

    Description

    学校里开设了n门课,其编号为0、1、2、……、n-1,但是有些课程需要完成其它课程才能学习。
    小s是一个卷王,他不学完所有课程就不高兴。但是安排课程的老师犯了一些错误,导致有些课程可能不能学习。比如课程0、1,课程0需要学完课程1才能学,课程1需要学完课程0才能学,则课程0、1都不能学。
    小s想要知道他最多能学多少门课。
    
    

    Input

    第一行一个int型整数T,代表一共有T组数据。
    对于每组数据,第一行一个整数n(n<=10000)和一个整数m(m<=10000)。接下来m行,每行两个整数x,y(0<=x,y<n),表示学课程y前必须学完课程x。
    
    

    Output

    输出T行, 每行包括一个整数, 代表每组数据小s最多能学的课程数。
    
    

    Sample Input

    1
    6 5
    0 1
    1 2
    2 3
    3 1
    2 4
    
    

    Sample Output

    2

    结果代码:

    #include<iostream>
    #include<vector>
    #include<queue>
    using namespace std;
    struct AdList
    {
    	vector<int>next;
    };
    int main()
    {
    	int T = 0;
    	cin >> T;
    	for (int t = 0; t < T; t++)
    	{
    		int n, m;
    		cin >> n; cin >> m;
    		int* count = new int[n];
    		vector<int>root;
    		for (int i = 0; i < n; i++)
    		{
    			count[i] = 0;
    		}
    		AdList* adlist = new AdList[n];
    		for (int i = 0; i < m; i++)
    		{
    			int x, y;
    			cin >> x;
    			cin >> y;
    			count[y]++;
    			adlist[x].next.push_back(y);
    		}
    		for (int i = 0; i < n; i++)
    			if (count[i] == 0)root.push_back(i);
    		for (vector<int>::iterator it = root.begin(); it != root.end(); it++)
    		{
    				queue<int>q;
    		        q.push(*it);
    				while (!q.empty())
    				{
    					int p = q.front(); q.pop();
    					int j = 0;
    					for(vector<int>::iterator t= adlist[p].next.begin(); t!= adlist[p].next.end();t++,j++ )
    					{
    						int k = adlist[p].next[j];
    							count[k]--;
    							if (count[k] == 0)q.push(k);
    						
    					}
    				}
    		}
    		int result = 0;
    		for (int i = 0; i < n; i++)
    		{
    			if (count[i] == 0)result++;
    		}
    		cout << result << endl;
    		delete[]count;
    		delete[]adlist;
    	}
    	return 0;
    }

    展开全文
  • 207 Course schedule 210 course schedule 2 269 Alien dictionary ...遇到这种题目,想一下:什么数据结构用的比较多?什么样的手法(技巧)用的比较多?有哪些需要 注意的点? 数据结构:HashMap(Hash

    207 Course schedule
    210 course schedule 2
    269 Alien dictionary
    329 longest increasing path in a matrix
    444 sequence reconstruction
    1203 sort items by groups respecting dependencies

    拓扑排序无关DFS/BFS 只要能做出来就行

    都是高频题目
    遇到这种题目,想一下:什么数据结构用的比较多?什么样的手法(技巧)用的比较多?有哪些需要 注意的点?
    数据结构:HashMap(HashSet)用的比较多 经常用在图的存取和维护上(有向图就存一次,无向图存两个?)
    这种题目的技巧就是:先存图,然后干该干的

    技巧:
    如何检测图中的环
    用出度入度数组来控制一些东西(BFS)
    用viisted来检测之前是不是走过(DFS)
    图的表示可以用hashmap也可以用邻接矩阵来做
    处度入度可以用数组或者用Hahsmap来做

    总结:
    对于题目中需要有排序的 比如说谁在谁前面我们知道 现在我们想要一条valid的路径什么什么之类的 大致上就是拓扑排序了,拓扑排序的话,用BFS DFS都可以 注意在此过程中需要维护的东西但是同时也要注意很多corner case,而且最开始的话 一定要想清楚应该如何去做,要有一个清醒的认识 corner case要敏感。总之这类题很考验一个人是不是有清醒的头脑和把一个复杂问题进行分析 并用代码实现,而且很好的处理那些corner case的问题。

    展开全文
  • 拓扑排序例题

    2022-04-12 19:58:10
    拓扑排序,是对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列。 拓扑排序: 算法流程: ①用队列来执行 ,初始化讲所有入度为0的顶点入队。 ②主要由以下两步循环执行,直到不存在入度为 0 ...
  • 拓扑排序 经典题

    千次阅读 2022-01-25 20:05:52
    //vec为Edge型的,在已知起点时可直接通过这个调用出边权和终点 void topo_sort()//拓扑排序 { for (int i=1;i;i++) if (ind[i]==0) q.push(i);//先将所有入度为0 的结点放入队列 while(q.size()) { int now=q.front...
  • 1.题目描述 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,
  • 对一个有向无环图进行拓扑排序,假如图中存在一条从顶点A到顶点B的路径,则拓扑序中顶点A出现在顶点B的前面。要注意的是,这是对有向无环图而言的,假如图是有环的,拓扑序就无从谈起了。在这道题目中,已经假定了图...
  • 拓扑排序: 对于有向无环图,访问当前顶点时必须 保证指向该顶点的所有顶点已经访问过 作用: 1.得到一个【拓扑序】(不唯一) 2.检测【有向图】是否有环:如果有拓扑排序则无环,否则有环 (如果存在环,则...
  • hdu 拓扑排序 题目归纳

    千次阅读 2016-06-01 17:57:38
    拓扑排序 定义和前置条件: 定义:将有向图中的顶点以线性方式进行排序。即对于任何连接自顶点u到顶点v的有向边uv,在最后的排序结果中,顶点u总是在顶点v的前面。 如果这个概念还略显抽象的话,那么...
  • 题目描述 给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。 请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。 若一个由图中所有点构成的序列 A 满足:对于图中的...
  • 13-拓扑排序以及查找练习- 题目描述 已知有向图,顶点从0开始编号,求它的求拓扑有序序列。 拓扑排序算法:给出有向图邻接矩阵 1.逐列扫描矩阵,找出入度为0且编号最小的顶点v 2.输出v,并标识v已访问 3.把矩阵第v行...
  • 题目内容:输出有向网的拓扑排序序列。 拓扑排序的基本思想为: 1)从有向图中选出一个无前驱的顶点输出; 2)将此顶点和以他为起点的弧删除; 3)重复1)2)直到不存在无前驱的顶点; 4)若此时输出的顶点数小于有...
  • POJ 拓扑排序题目总结

    2012-08-05 19:39:00
    POJ 拓扑排序题目总结 1270 Following Orders 给出一个字母表和一些字母对(char1,char2)表示char1一定要在char2前面。求出所有满足要求的排列,并按照字典序输出。 这题一定要注意,字母表不一定是有序的,其实也...
  • 拓扑牌序 入门理解(附有例题)
  • PAGE 数据结构课程设计 设计说明书 有向图拓扑排序算法的实现 学生姓名 樊佳佳 学号 1318064017 ...数据结构课程设计 课程设计题目 图的拓扑排序算法的实现 完 成 期 限 自 2015年 12月20日至 2016年 1 月 3 日共 2 周
  • 拓扑排序(topological sorting)介绍及Python实现,介绍了拓扑排序基本算法原理,并给出基于深度优先搜索和基于广度优先搜索的Python实现。
  • c语言拓扑排序

    2022-05-21 12:01:38
    (2) 设计拓扑排序算法,输出AOV的拓扑排序。 (3) 设计关键路径算法,计算出事件的最早发生时间和最晚发生的时间,计算出活动的最早和最晚的发生时间并输出关键路径。 1.3 程序运行的原理 AOV网:在一个表示...
  • 拓扑排序

    万次阅读 多人点赞 2021-02-02 17:50:31
    拓扑排序 一、拓扑排序的定义: 先引用一段百度百科上对于拓扑排序的定义: 对一个有向无环图 ( Directed Acyclic Graph 简称 DAG ) G 进行拓扑排序,是将 G 中所有顶点排成一个线性序列,使得图中任意一对顶点 u ...
  • 所谓拓扑排序就是对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。 可能这个定义有点难理解,那接下来我就说说...
  • 拓扑排序及其应用

    2021-12-14 17:42:26
    Leetcode210课程表2两种解法,拓扑排序以及DFS的应用。
  • 这里具体讲一下为什么要用拓扑排序(思维过程)
  • 拓扑排序模板+题目

    2019-02-23 15:18:37
    拓扑排序模板 输入初始化,记录有向边和入度 void Init(){ for(int i=1;i&lt;=m;i++){ int t1,t2; scanf("%d%d",&amp;t1,&amp;t2); G[t1].push_back(t2); indegree[t2]++; } } ...
  • 拓扑排序(c++)

    千次阅读 2022-03-21 20:42:15
    拓扑排序 先统计所有节点的入度,对于入度为0的节点就可以分离出来,然后把这个节点指向的节点的入度减一。 一直做这个操作,直到所有的节点都被分离出来。先统计所有节点的入度,对于入度为0的节点就可以分离出来,...
  • 拓扑排序(附例题)

    千次阅读 2021-11-23 15:19:06
    ACWING848 拓扑排序 给定一个 n nn 个点 m mm 条边的有向图,点的编号是 1 11 到 n nn,图中可能存在重边和自环。 请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 − 1 -1−1。 若一个由图中所有点...
  • 拓扑排序
  • 拓扑排序--C语言

    2017-01-23 20:58:29
    基本思想: 1、在有向图中选一个没有前驱(入度为0)的顶点且输出; 2、从图中删除该顶点和所有以它为尾的边。 重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的.../*--有向无环图拓扑排序--*/
  • 拓扑序列(拓扑排序

    千次阅读 2022-05-09 22:55:05
    如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的情况。 下面是算法的演示过程。 先来个暴力代码,但是好理解的代码: #include #include using namespace std; typedef long ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,518
精华内容 7,007
关键字:

拓扑排序题目