实用算法实现-第 16 篇 拓扑排序

数据结构——16.1 拓扑排序 想象一下你在大学里选课,很多课程有先修要求,比如想学《数据结构》,你必须先学完《程序设计基础》。(Cycle),比如“任务A依赖任务B,任务B又依赖任务A”,这就形成了一个逻辑死锁,永远无法开始,因此。考试很可能会给你一个图,让你写出所有可能或其中一种拓扑序列。这部分内容帮助你建立对拓扑排序的直观理解,主要用于回答笔试中的概念题和简答题。这部分是考试的重点,需要你理解算法的每一步,并能进行手动模拟。,保证你在学习任何一门课程时,它的所有先修课程都已经被学完。,那么在这个序列中,A必须出现在B的前面。 阅读详情

16.1    拓扑排序

拓扑排序的本质是由某集合上的一个偏序得到该集合上的一个全序。

16.1.1   实例

PKU JudgeOnline, 1094, Sorting It All Out.

16.1.2   问题描述

给出类似A<B的一系列关系,判断输入第几个关系的时候顺序排定,或者出现环,或者所有输入完成后仍没出现环或者排定顺序。

注意:当拓扑排序不唯一(当然也就不确定)的时候 还要判断是否有环。

注意:如果前几条不等式可以确定一个序列,那么后面的的都要被忽略,即使加上它们会发生矛盾。

16.1.3   输入

46

A<B

A<C

B<C

C<D

B<D

A<B

32

A<B

B<A

261

A<Z

0 0

16.1.4   输出

Sortedsequence determined after 4 relations: ABCD.

Inconsistencyfound after 2 relations.

Sortedsequence cannot be determined.

16.1.5   分析

每次得到一个关系式后,做一次推理。

如果得到关系A<B,那么更新已知所有比A的x都比B小,更新所有比B大的x都比A大。同时检查有无冲突,并且更新推理出的关系个数。

可以显然地知道如下结论:

1. 出现矛盾关系,当且仅当:出现A<A关系,或者出现A<B&&B<A关系。

2. 如果发现n*(n-1)/2个互不相同的不矛盾的关系,那么序列已确定。

3. 第i小的数比i-1个数小。

有了以上结论,问题很容易解出。

16.1.6   程序

#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
#define maxNum     26
int larger[maxNum][maxNum];
int smaller[maxNum][maxNum];
int smallerNum[maxNum];
int relationNum;
#define SMALLER    0
#define LARGER     1
int fail;
int n;
void setRelation(int small, int large){
     if((larger[large][small]== 1)||
     (smaller[small][large] == 1)||
     small == large)
     {
         fail = 1;
         return;
     }
     larger[small][large] = 1;
     smaller[large][small] = 1;
     smallerNum[large]++;;
     relationNum++;
}
void relation(int small, int large)
{
     int i;
     if(larger[small][large]!= 0)
     {
         return;
     }
     setRelation(small, large);
     for(i = 0;i < n; i++){
         if(smaller[small][i]== 1)
         {
              relation(i, large);
         }
         if(larger[large][i]== 1)
         {
              relation(small, i);
         }
     }
}
void printResult()
{
     int i, j;
     for(i = 0;i < n; i++)
     {
         for(j =0; j < n; j++){
              if(smallerNum[j]== i){
                   printf("%c", j + 'A');
              }
         }
     }
     printf(".\n");
}
int main()
{
     int m;
     int i;
     int num;
     int finish;
     char small,large;
     while(scanf("%d%d", &n, &m)){
         if(n ==0&& m == 0)
         {
              break;
         }
         memset(smaller, 0, sizeof(smaller));
         memset(larger, 0, sizeof(larger));
         memset(smallerNum, 0, sizeof(smallerNum));        
         relationNum = 0;
         fail = 0;
         finish = 0;
         num = n * (n - 1) / 2;
         for(i =1;i <= m; i++){
              scanf("\n%c<%c",&small, &large);
              //printf("%c<%c\n",small, large);
              if(fail== 0 && relationNum < num)
              {
                   relation(small - 'A', large - 'A');
                   if(fail== 1){
                       printf("Inconsistency found after %d relations.\n",i);
                   }elseif(relationNum == num){
                       printf("Sorted sequence determined after %d relations:", i);
                       printResult();
                   }
              }
         }
         if(fail== 0 && relationNum < num)
         {
              printf("Sortedsequence cannot be determined.\n");
         }
     }
}


16.2    实例

PKU JudgeOnline, 2762, Going from u to v or from v to u?.

PKU JudgeOnline, 1094, Sorting It All Out.

本文章欢迎转载,请保留原始博客链接http://blog.youkuaiyun.com/fsdev/article

AMEsim不连续处理机制:仿真精度与效率的平衡艺术 本文深入解析AMEsim不连续处理机制在系统仿真中的应用,探讨如何平衡仿真精度与效率。通过液压系统仿真案例,详细介绍了事件检测算法、变步长求解器自适应策略及典型场景优化方法,帮助工程师有效应对仿真中的不连续性问题,提升仿真效率和准确性。 阅读详情

相关推荐

保姆级教程:用PROGRAM_FTDI搞定Xilinx FPGA的JTAG调试器(基于FT232/FT2232/FT4232)

本文详细介绍了如何使用FT232/FT2232/FT4232系列芯片通过PROGRAM_FTDI工具配置Xilinx FPGA的JTAG调试器。从芯片选型、驱动安装到固件烧写和Vivado验证,提供了完整的实操指南和避坑要点,帮助开发者低成本实现高效调试。

weixin_29271053的博客 2157

网络篇 物理拓扑与逻辑拓扑-19

一、 拓扑的概念 当人们说搭建某某拓扑时,很多人对于拓扑这个概念是很不理解(当初我也是这样,花了很多时间来理解这个概念)。拓扑指的是设备互连的方法,由于涉及到主用路径与备用路径,拓扑又分为物理拓扑与逻辑拓扑。 物理拓扑:设备与电缆的物理布局,这个最好理解了,通俗的说,就是我们看到的物理结构就是物理拓扑。 逻辑拓扑:数据传输时的真实路径,这个是最难理解的,特别是相对于初学者来说,理解这个概念的话,强烈建议掌握我之前写的VLAN配置那篇文章,因为下面的案例会使用到它。 二、常见的物理拓扑 ...

佐德将军的博客 2万+

告别License烦恼:手把手教你用VS Code+Cppcheck搭建免费的MISRA-C代码检查环境

本文详细介绍了如何使用VS Code和开源工具Cppcheck搭建免费的MISRA-C代码检查环境,帮助开发者规避商业工具的高额License费用。通过四步环境搭建和实战技巧,实现高效的代码静态检查,提升嵌入式开发的安全性和可靠性。

weixin_42523326的博客 248

【原】 POJ 1094 Sorting It All Out 拓扑排序 解题报告

http://poj.org/problem?id=1094 方法: 每加入一条边就进行一次拓扑排序,从而找到符合条件的最少边数 拓扑排序的基本思想就是依次找到图中入度为0的节点,将该节点和其对应的边删除,这样就使得它的邻接节点的入度-1。反复循环这样做直到所有节点都从图中删除(都被编上拓扑编号),或者因为有环所以还剩下某些节点未被删除 Descrip...

ajiaxi111111的博客 203

STM32F407硬件SPI驱动ADS1220避坑指南:从寄存器读不到数据到采样值异常的完整解决流程

本文详细解析了STM32F407硬件SPI驱动ADS1220的常见问题与解决方案,包括SPI配置、寄存器读取异常、采样值优化等关键环节。通过CubeMX配置技巧和Keil调试经验,帮助开发者快速排查从通信失败到数据异常的各种问题,实现高精度数据采集系统的稳定运行。

weixin_26878995的博客 158

一位海外开发者的 OpenSPG KAG 实践分享

KAG 是一个以创建和操作知识图谱为核心的框架。知识图谱是数据之间相互关联的可视化和结构化表示,对于搜索引擎、推荐系统和机器学习等应用至关重要。KAG 的目标是提供一个强大的平台,使开发者能够:轻松构建图谱;通过增强算法丰富数据;集成人工智能,以进行更精确的推理。通过理解 KAG,可以明显看出,这个框架旨在帮助从初学者到专业开发者,在项目中创造更优的解决方案。它在简便性和集成方面的优势,使其成为下一代基于数据的应用程序的前景工具。

金融机器智能社区 3405

poj1094 Sorting It All Out(拓扑排序)

Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28422   Accepted: 9822 Description An ascending sorted sequence of distinct values is one

听自己心跳的声音 582

手把手教你学 NPU 驱动开发--第一部分:基础准备 开发环境搭建:Linux 内核编译与 NPU 仿真平台配置

摘要:本文详细介绍了搭建Linux内核编译与NPU仿真平台的完整流程。主要内容包括:1) 准备ARM64交叉编译工具链;2) 编译支持KGDB调试的Linux内核;3) 构建最小根文件系统;4) 使用QEMU模拟自定义NPU设备;5) 配置KGDB调试环境。文章重点讲解了如何通过修改设备树添加虚拟NPU设备,并提供了开源NPUIP Gemmini作为实验对象。最后展示了简单的"Hello NPU"驱动验证方法,为后续NPU驱动开发奠定了基础。文中还附有常用命令速查表,方便开发者快速搭建调

MHD0815的博客 384

POJ1094 Sorting It All Out 拓扑排序 入度(注意优先级)

【POJ1094】Sorting It All Out 拓扑排序 入度(注意优先级) Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 40917 Accepted: 14342 Description An ascending sorted sequence of distinct va...

weixin_44254717的博客 270

【全局路径规划地图算法】Voronoi路径规划探索(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Voronoi路径规划探索做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 2241

华为OD机试 - 第k个排列 - 全排列递归(Python/JS/C/C++ 2025 C卷 100分)

给定参数n,从1到n会有n个整数:1,2,3,…,n,这n个数字共有n!按大小顺序升序列出所有排列的情况,并一一标记当n=3时,所有排列如下“123”,“132,“213”,“231”,“312”,“321”输入两行,第一行为n,第二行为k,给定n的范围是[1,9],给定k的范围是[1,n!排列为“12”和“21”,第2个是“21”。给定n和k,返回第k个排列。输出排在第k位置的数字。只有一个排列,直接返回。

学Java,找哪吒 984

拓扑排序及算法实现

一、拓扑排序概念 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。 简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。 二、理解 在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。...

ShyTan的博客 1万+

CDR插件开发之CPG插件004 - 认识VGCore并编译生成你的第一个CPG文件

上篇文章中,讲到了使用VS2019编译CDR类型库 VGCoreAuto.tlb,编译后得到了vgcoreauto.tlh和vgcoreauto.tli两个文件。本文将对这两个文件说明,并演示通过标准的libid形式来导入CDR类型库,在这个过程中,穿插一些VS2019的使用技巧(删除目录、复制工程、打开项目或解决方案、修改解决方案名称、修改项目名称等),使读者循序渐进,逐步提高对VS2019工具的熟练程度,最后通过修改项目属性配置,生成第一个CPG文件。

Zebe 2984

有向图的拓扑排序算法JAVA实现

一,问题描述 给定一个有向图G=(V,E),将之进行拓扑排序,如果图有环,则提示异常。 要想实现图的算法,如拓扑排序、最短路径……并运行看输出结果,首先就得构造一个图。由于构造图的方式有很多种,这里假设图的数据存储在一个文件中, 每一行包含如下的信息:LinkID,SourceID,DestinationID,Cost 其中,LinkID为该有向边的索引,SourceID为该有向边的起始顶点的索引,DestinationID为该有向边的终止顶点的索引,Cost为该有向边的权重。 (以上示例.

梦想还是要有的,万一实现了呢! 1312

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

拓扑排序之java实现_有向图的拓扑排序算法JAVA实现

一,问题描述给定一个有向图G=(V,E),将之进行拓扑排序,如果图有环,则提示异常。要想实现图的算法,如拓扑排序、最短路径……并运行看输出结果,首先就得构造一个图。由于构造图的方式有很多种,这里假设图的数据存储在一个文件中,每一行包含如下的信息:LinkID,SourceID,DestinationID,Cost其中,LinkID为该有向边的索引,SourceID为该有向边的起始顶点的索引,Des...

weixin_36433147的博客 453

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

拓扑排序算法详解:BFS与DFS双路径实战

在计算机科学中,拓扑排序(Topological Sorting)是一种经典的数据结构算法,广泛应用于解决依赖关系问题。无论是任务调度、课程安排,还是软件开发的依赖管理,拓扑排序都能帮助我们理清复杂的先后顺序关系。本文将从拓扑排序的基础定义和应用场景入手,逐步深入到Python实现,并提供详细的代码示例和实际案例。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供清晰的知识框架和实用的操作指南。让我们一起探索拓扑排序的奥秘吧!拓扑排序是数据结构中针对有向无环图(DAG)的一种重要操作。

吴师兄大模型的博客 1423

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

拓扑排序算法详解

一、定义:是将一个有向无环图G的所有的顶点排成一个线性序列,使得有向图中的任意的顶点u 和 v 构成的弧属于该图的边 集,并且使得 u 始终是出现在 v 的前面。通常这样的序列称为是拓扑序列。 注意: 只有有向无环图才可以进行拓扑排序 二、算法思想: 1.找到有向无环图中没有前驱的节点(或者说是入度为0的节点)输入; 2.然后从图中将此节点删除并且删除以该节点为尾的弧;

shao1996的博客 5950

邻接表实现有向图BFS、DFS、拓扑排序

图的大家族 常用图的存储结构有两种:邻接矩阵,邻接表。一个数组,一个链表,可见复杂的数据结构是建立在基础结构之上的,在这里选择邻接表存储,边比较少时省空间。 图按照有无方向,有无权重,分为四类 无向无权:无向图 无向有权:无向网 有向无权:有向图 有向有权:有向网 可见带有权重称为网,否则称为图。 图可以看成边权均为1,所以是特殊网。因此掌握了网,也就顺带会了图 由于无向图均有对称性,所以大...

努力做个书呆儿 5479

拓扑排序的两种算法

1. 拓扑排序主要有两种算法:方法1:《算法导论》上给出的DFS+时间戳;方法2:求顶点入度+贪心算法。 2. 两种算法的代码分别如下: View Code 1 static int f[100]={0}; 2 static int ftime=0; 3 //递归深度优先搜索 4 template<typename vertexNametype, ...

ah7975的博客 518

【优选算法之BFS】No.16---多源BFS和BFS解决拓扑排序

【优选算法之BFS】No.16---多源BFS和BFS解决拓扑排序

小沈.的博客 1612

拓扑排序的实现

看了拓扑排序 这里走一遍拓扑排序的代码以及运算结果 相关的代码解释 已经在程序中标明了! #include <iostream> #include <stack> using namespace std; const int MAX_VERTEX_NUM = 30;//最大结点数 stack<int> s;//定义栈 存储度为0的顶点 typedef ...

Zyong139064359的博客 288

拓扑排序 C++实现

【拓扑排序主要思想】  有向图可以拓扑排序的条件是:图中没有环。  具体方法:  ⑴ 从图中选择一个入度为0的点加入拓扑序列。  ⑵ 从图中删除该结点以及它的所有出边(即与之相邻点入度减1)。  反复执行这两个步骤,直到所有结点都已经进入拓扑序列。 参照严蔚敏的《数据结构(C语言版)》教材,163页有图的邻接表结构定义方法,181-182有课程优先关系的用例和拓扑排

天堂人间 1万+

java 有向图_有向图的拓扑排序算法JAVA实现

一,问题描述给定一个有向图G=(V,E),将之进行拓扑排序,如果图有环,则提示异常。要想实现图的算法,如拓扑排序、最短路径……并运行看输出结果,首先就得构造一个图。由于构造图的方式有很多种,这里假设图的数据存储在一个文件中,每一行包含如下的信息:LinkID,SourceID,DestinationID,Cost其中,LinkID为该有向边的索引,SourceID为该有向边的起始顶点的索引,Des...

weixin_39630637的博客 169

详解C++实现拓扑排序算法

拓扑排序对应施工的流程图具有特别重要的作用,它可以决定哪些子工程必须要先执行,哪些子工程要在某些工程执行后才可以执行。为了形象地反映出整个工程中各个子工程(活动)之间的先后关系,可用一个有向图来表示,图中的顶点代表活动(子工程),图中的有向边代表活动的先后关系,即有向边的起点的活动是终点活动的前序活动,只有当起点活动完成之后,其终点活动才能进行。通常,我们把这种顶点表示活动、边表示活动间先后关系的有向图称做顶点活动网(Activity On Vertex network),简称AOV网。

raoxiaoz0425的博客 36
上一篇: 实用算法实现-第 15 篇 对抗搜索
下一篇: 实用算法实现-第 17 篇 强连通分支
存储李希
博客等级 码龄15年 418粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值