简单的拓扑排序

拓扑排序入门(真的很简单) 在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。 先统计所有节点的入度,对于入度为0的节点就可以分离出来,然后把这个节点指向的节点的入度减一。 一直做改操作,直到所有的节点都被分离出来。 如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的情况。 下面是算法的演示过程。 下面是我以前的写法,比较好理解,但是效率低 //b[]... 阅读详情

这里我要说的拓扑排序和你见到的图的拓扑排序不一样,这是个简单的n个事件对应m种关系的拓扑排序,因此里面就有些细节要注意。

对于拓扑排序,你一定要看清楚是给出的哪种关系?这就直接决定了,你的排序方法。先看代码,没一定基础的同学肯定看不懂,最后,稍加解释。

#include<iostream>
using namespace std;
void topo(int n,int r[],int m,int p[]){
	int top,i,j,k,t,*s,*g,*f;
	struct node{
	int suc;
	int next;
	} *q;
	q=new node[m];
	f=new int[n];
	s=new int[n];
	g=new int[n];
	top=-1;t=0;

	for(k=0;k<=n-1;k++)
	{f[k]=0;g[k]=-1;}


	for(k=0;k<=m-1;k++)
	{
	i=r[k+k];j=r[k+k+1];
	f[j-1]=f[j-1]+1;
	q[k].next=g[i-1];
	q[k].suc=j;
	g[i-1]=k;
	}


	for(k=0;k<n;k++)
		if(f[k]==0) {top=top+1;s[top]=k+1;}

		while(top!=-1){
		i=s[top];top=top-1;p[t]=i;t=t+1;
		k=g[i-1];
		while(k!=-1){
		j=q[k].suc;f[j-1]=f[j-1]-1;
		if(f[j-1]==0){top=top+1;s[top]=j;}
		k=q[k].next;
		}
		}
	for(k=0;k<n;k++)
		if(f[k]!=0){p[t]=-(k+1);t=t+1;}
	delete f;
	delete g;
	delete s;
	delete q;
	return;
}
然后写一个调用它的函数,如下:

#include"topo.h"
int main(){
	int p[7],i;
	int r1[8][2]={{3,1},{3,2},{4,6},{4,7},{5,4},{5,6},{5,7},{6,7}};
	int r2[6][2]={{3,1},{3,2},{2,7},{4,5},{5,6},{6,4}};
	topo(7,&r1[0][0],8,p);
	for(i=0;i<=6;i++) 
		cout<<p[i]<<" ";
	cout<<endl;
	topo(7,&r2[0][0],6,p);
	for(i=0;i<=6;i++) 
		cout<<p[i]<<" ";
	cout<<endl;
	return 0;
}
大家,看懂了吗?

这里面确实很有技巧,跟你一般通常见到有关什么链表啊,都不太一样。

1.注意到,q,f,s,g了吗?它们是干什么用的?

q是相当于申请了一个放这m关系的链表,而f数组放当前节点它的前面结点个数,s申请一个栈空间,利用栈的性质输出f[i]=0的元素,而g数组用于存放结点指针域的

2.首先初始化数组f为0,数组g为-1;

读取这个二维数组,把当前f[j]加1,而令当前的指针指到g[i],它的后继为j,然后记录当前这个结点下标。

把这些f[0] 的全部入栈,然后,输出它,而和它有关系的后继,全部减1,接着考虑i的下一个结点。

最后,对于,那些没关系的数据,进行特殊处理,取相反数即可。

这个,尤其是下标的变化和指针域,特别乱,不好好想,肯定不明白的。图就不给大家截了。


STM32 上 FreeRTOS 的启动与任务调度详解 4. SysTick定时器:FreeRTOS启动调度器后,会接管STM32的SysTick定时器,用于生成系统节拍,因此不要在HAL库中重复配置SysTick(比如HAL_Init()中已配置,无需再手动调用SysTick_Config()),否则会导致系统节拍异常,任务延迟不准。2. 任务栈大小需按需配置,不是越大越好(浪费RAM),也不能太小(会导致栈溢出),比如简单的传感器读取任务,1024字(4096字节)足够,复杂任务(比如串口接收+数据解析)可调整为2048字。 阅读详情

相关推荐

用宝塔面板+CentOS 7.6,30分钟搞定DNF手游私服搭建(附全套资源下载)

本文详细介绍了如何使用宝塔面板和CentOS 7.6在30分钟内快速搭建DNF手游私服。通过图形化界面操作,无需复杂命令,即可完成服务端部署、MySQL数据库配置及客户端适配,适合Linux新手快速上手。

weixin_33737774的博客 593

拓扑排序 很简单

Step2:针对Step1中找出的节点,依次访问这些节点的相邻结点,并将其相邻结点的入度-1(相当于删除了当前入度为0的点,所以相邻结点的入度会-1),然后判断相邻结点的入度,如果-1后等于0,那么将其加入队列。这道模板题呀,很简单,由于题目没有说,因此不需要考虑一些异常情况,比如图的连通性,如果在拓扑排序中有冲突怎么办等等,因此我们只需要考虑它的正常情况就行了,非常适合新手练习拓扑排序,自己动手完成吧。理解了这道题的意思,就很容易理解拓扑排序是什么意思了。入度:在有向图中,指向自己的箭头的个数。

PengFly123的博客 468

halcon C++编程 第4讲 HObject/HImage Mat相互转换(tcy)

网上有很多相互转换程序,但并不知那个正确,本文对相互转换后的结果和原对象比较是否相同判断转换是否正确。经测试ok.本文包括转换代码及测试是否相同。 1.转换程序: /************************************ HObject转为Mat:time:2021/3/16 V1.0 *************************************/ cv::Mat HalconClass::HObjectToMat(const HalconCpp::HObject&..

tcy-阿春 4929

拓扑排序简单实现(C语言)

拓扑排序简单实现(C语言拓扑排序预备知识执行步骤图解代码实现 今天刷洛谷的图时看到好多题都要用图的拓扑排序,索性就学一把,敲一敲代码学学算法也复习一下图的具体操作和栈的使用。 拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,

Lucky Home 7471

MCGS触摸屏Modbus TCP通讯实战:从寄存器写入到字符串处理的完整代码解析

本文详细解析了MCGS触摸屏通过Modbus TCP协议实现寄存器写入和字符串处理的完整代码,涵盖单寄存器写入、多寄存器写入及字符串传输等核心技术。文章还提供了MCGS组态环境中的实战配置步骤和常见问题排查方法,帮助开发者快速掌握工业自动化通讯的关键技术。

study的专栏 754

2.4G射频微带线阻抗匹配设计实战(WiFi/BLE)

本文深入探讨了2.4G射频微带线阻抗匹配在WiFi/BLE产品开发中的关键作用。文章详细解析了共面波导微带线结构,提供了基于SI9000工具的阻抗计算实战指南,并总结了不同PCB板厚下的设计参数对照表。同时,文章分享了PCB布局布线、与板厂沟通以及天线匹配调试等核心避坑经验,旨在帮助硬件工程师构建从射频芯片到天线的稳定高效传输通道。

j0k1l2m3n的博客 367

拓扑排序(简单版)

拓扑排序是图论中的知识。就是将一个有向无环图中的节点进行阶级划分,具体来说就是求出一个有序点列使其严格满足其中的每一个节点都不能指向它的前一个结点。具体做法很简单:每次遍历每个点,将入度为0的点记录,而后删掉该点及其所在边。反复直至点删完,最后将记录的点打印下来。显然1是第一阶级,2,3,4第二阶级,5,6第三阶级,但往往同一阶级的节点只要求输出一种,做起来会方便一些。主要用途就是判断回路之类的。注意题目要求输出,比如要求是字典序的话就用优先队列之类的。

Njhemu的博客 1222

流程图详解Transformer最核心的多头注意力机制,QKV流向清晰明了

本文详细讲解了Transformer模型中的多头注意力机制(Multi-head Attention)。通过类比多人评估同一事物的不同视角,说明多头机制能综合多个注意力权重获得更有效的输出。文章逐步推导了多头注意力的计算过程:将输入矩阵X(4×512维)分别与8组Q、K、V权重矩阵相乘,得到8组head(每组4×64维),拼接后经Wo矩阵变换恢复为4×512维输出。整个过程涉及37个待训练参数矩阵(1个Wo、8组Wq/Wk/Wv)。该机制通过并行计算多个注意力头,能更全面捕捉输入特征间的复杂关系。

人工智能研究所的博客 254

拓扑排序真的很简单

什么是拓扑排序 说拓扑排序之前,先来说一下为什么要有拓扑排序,假设,我们有一份课程表。我们学当前课程的时候,必须要满足学完某些课程的条件,才能学当前课程,我们把这种满足条件称为先决条件,用一张表表示如下: 我们再把表抽象成图,就能够直观感受到课程之间的联系: ID 课程名 先决条件 1 高数 2 计算机 高数 3 数据库 计算机、英语 4 英语 高数 我们再把表抽象成图,就能够直观感受到课程之间的联系: 再来看图,就能够看出每个课程之间的关系,如何学习每门课程的顺序就能够

weixin_44905889的博客 2720

多模态论文笔记——BLIP

本文详细介绍这几年AIGC火爆的隐藏功臣,多模态模型:BLIP。

haopinglianlian的博客 2453

【雷达通信】雷达信号处理仿真【含Matlab源码 2509期】

雷达信号处理仿真 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 903

拓扑排序-简单实现

package com.ygy.test.sort;import lombok.Getter; import lombok.Setter; import org.springframework.util.CollectionUtils;import java.util.*;/** * Created by guoyao on 2017/10/11. *///简单的拓扑排序 public clas

csdn_ygy的博客 337

【硬件工程师面经整理18_Smith圆图】

若文中任何内容侵犯了您的合法权益,请相关权益人及时与我联系,我将立即进行核实并采取适当措施,包括但不限于删除相关内容或更新文章以消除影响。**在Smith圆图上,源阻抗表示为圆心,而负载阻抗表示为圆图上的一个点。具体来说,通过将负载阻抗在Smith圆图上移动到特定位置,使其与传输线特性阻抗形成纯电阻或纯电抗的组合,从而实现匹配。例如,反射系数表示为Smith圆图上的一个点,而驻波比则表示为圆图上两个点之间的距离。Smith圆图是用于阻抗匹配和网络分析的工具,它是一种将复阻抗表示为坐标的图形。

LeeYLong的博客 651

简单拓扑排序

拓扑排序 在有向图 中经常用来判断 是否存在 环. 若一个有向图中 存在 拓扑排序,则 一定不存在 环 若存在 环 ,则一定不存在 拓扑排序 举个例子 : 假设有 n 个变量,有 m 个二元组 (u,v),分别表示 变量u 小于 v.那么,所有变量从小到大排列起来. 例如:四个变量a,b,c,d,若已知 a < b,c < b ,d < c,则这 4 个变量的排序 可能是 ...

qq_43701555的博客 298

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

拓扑排序的简单认识

拓扑排序可以说是图结构中的一种,而这里的权的作用是用来标记。拓扑排序的对象可以说是一个有向无环图,而拓扑排序是用来对图中相连两点之间的关系进行排列,比如三个点A,B,C,三点之间的关系是(A,B)(A,C)(B,C),要保证A在B前面,A在C前面,B在C前面,那么因此对于A,B,C的排序就称为拓扑排序。换一种说法就是:由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。 拓扑排序...

ZL0_bo的博客 295

Statistics and Machine Learning Toolbox

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

HDU 3342 Legal or Not(简单拓扑排序判定)

HDU 3342 Legal or Not(简单拓扑排序) http://acm.hdu.edu.cn/showproblem.php?pid=3342 题意:给你一个N点和M条有向边的图,问你该图是否可拓扑排序. 分析:没什么可说的,直接用topo()函数判断所给的有向图是否可拓扑排序即可. AC代码: #include #include #include #include using

code 2442

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

拓扑排序简单理解

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若&lt;u,v&gt; ∈E(G),则u在线性序列中出现在v之前。一个有向无环图的拓扑序列不是唯一的:注意:   1)只有有向无环图才存在拓扑序列;   2)对于一个DAG,可能存在多个拓扑序列;进行拓扑排序的算法并不复杂:(思想)1)在有向图中...

yu121380的博客 6293

简单的拓扑排序模板

拓扑排序 一.定义     对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。    通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。    注意:    1)只有有向无环图才存在拓扑序列;

baidu_30309461的博客 576

简单拓扑排序的实现

/*拓扑排序的实现*/ #include #include using namespace std; #define MAX 100 int main() { int map[MAX][MAX]; int d[MAX]; int c[MAX]; int n,m; while(cin>>n>>m) { if(m==0&&n==0

Enigma_hao的专栏 1031

拓扑排序的简单实现

拓扑排序就是把一个图的所有节点排序,使得每一条有向边(u,v)对应的u都排在v的前面 算法流程 记录图中各个点的入度,每次选取度为0的点,然后更新删除与他相邻的边,即度数减1. 1.如果没有度为0的点,说明存在圈 2.有多个说明没有确定的序列,但不影响拓扑排序 3.重边没有影响,因为度也随之增加。 int n,m; vector g[105]; int topo[105]; i

熟睡的哲学家的博客 351

拓扑排序排课系统_简单了解什么是拓扑排序

先穿袜子,再穿鞋子。这也是一种拓扑排序。拓扑排序 (Topological sorting)某校的选课系统规定,每门课可能有若干个先修课,如果要修读某一门课程,则必须要先 修完所有的先修课才能修读。假设一个学生同时只能报一门课程,那么选课系统允许他修完所有课程的顺序就是一个拓扑序...从上述小例子中可以看出,拓扑排序是一个有效的任务顺序,每一门课对应有向图的一个顶点, 先修关系对应有向图的一条边...

weixin_39805195的博客 327

最简单的拓扑排序

( 纯属个人胡猜乱蒙 , 切勿信以为真 )拓扑排序 , 实际上的思想 我感觉还是建树 和 吝啬的国度的 建图过程应该是差不多的 , 然后就去 vector 建图了 , 结果一段时间 没有这样做过 现在 建好之后不能用就懵逼了 ....... 先付上简单二维数组解决 一会再去试试 vector 解决 1 #include<stdio.h> 2 #in...

weixin_30652271的博客 60

拓扑排序简单题

确定比赛名次题目传送:HDU - 1285 - 确定比赛名次思路:拓扑排序AC代码①(遍历找最小字典序):#include <map> #include <set> #include <cmath> #include <deque> #include <queue> #include <stack> #include <cstdio> #include <cctype> #include <stri

Never say never 2067

洛谷 P1113 杂务 简单拓扑排序

洛谷 P1113 杂务 简单拓扑排序 题解: 基本就是一道拓扑排序裸题。 代码如下: #include<iostream> #include<algorithm> #include<stdio.h> #include<cmath> #include<queue> #include<cstring> #include<ve...

化身孤岛的鲸o的博客 460

简单易理解的拓扑排序算法

拓扑排序 理解拓扑排序,首先要大致了解一下拓扑序列,设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1, v2, …, vn称为一个拓扑序列,那么这个序列当且仅当满足下列条件:若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必在顶点vj之前。拓扑排序就是对一个有向图构造拓扑序列的过程。 基本思路 1.从有向图中选择一个没有前驱(度为0)的顶点输出。 2.从有向图中删去该顶点,并删去...

fakerth的博客 847
上一篇: 二叉排序树的实现和操作
下一篇: 算法导论-前言
Scofield-
博客等级 码龄14年 12粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值