首页 > 其他分享 >学习笔记:拓扑排序

学习笔记:拓扑排序

时间:2023-10-28 16:11:31浏览次数:37  
标签:cnt int 拓扑 笔记 MAXN 序列 排序

拓扑排序

引入

拓扑排序是一个有向无环图的所有顶点的线性序列。

该序列需要满足每个顶点出现且只出现一次和如果有一条 AA 到 BB 的路径,在序列中 AA 出现在 BB 的前面。

实现

拓扑排序的步骤:

  • 计算每个点的入度。
  • 入度为 \(0\) 就加入队列。
  • 当队列不为空则循环:
    • 取出队首元素并输出。
    • 遍历队首元素的连边,对应节点的入度 \(-1\)。
    • 当对应的节点入度为 \(0\) 就加入队列。

例题

洛谷 B3644【模板】拓扑排序 / 家谱树

题目描述

有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。给出每个人的后代的信息。输出一个序列,使得每个人的后辈都比那个人后列出。

输入格式

第 \(1\) 行一个整数 \(N\)(\(1 \le N \le 100\)),表示家族的人数。接下来 \(N\) 行,第 \(i\) 行描述第 \(i\) 个人的后代编号 \(a_{i,j}\),表示 \(a_{i,j}\) 是 \(i\) 的后代。每行最后是 \(0\) 表示描述完毕。

输出格式

输出一个序列,使得每个人的后辈都比那个人后列出。如果有多种不同的序列,输出任意一种即可。

#include <iostream>
#include <queue>
#define MAXN 105
using namespace std;
int n, t;
struct edge{int to, nxt;}e[MAXN * MAXN];
int head[MAXN], cnt = 1, rd[MAXN];
queue <int> q;
queue <int> ans;
bool flag;
void add(int u, int v){
    cnt++;e[cnt].to = v;e[cnt].nxt = head[u];head[u] = cnt;
}
int main(){
    cin >> n;
    for(int i = 1 ; i <= n ; i ++)
        do{cin >> t;add(i, t),rd[t]++;}while(t != 0);
    for(int i = 1 ; i <= n ; i ++)
        if(rd[i] == 0)q.push(i), ans.push(i);
    while(!q.empty()){
        t = q.front();q.pop();
        for(int i = head[t] ; i != 0 ; i = e[i].nxt){
            int v = e[i].to;rd[v]--;
            if(rd[v] == 0)q.push(v),ans.push(v);
        }
    }
    while(!ans.empty() && ans.front() != 0){
        t = ans.front();ans.pop();
        if(flag == true)putchar(' ');
        cout << t;flag = true;
    }
    cout << endl;return 0;
}

标签:cnt,int,拓扑,笔记,MAXN,序列,排序
From: https://www.cnblogs.com/tsqtsqtsq/p/17794206.html

相关文章

  • 学习笔记7
    第三章第四章并发编程并行计算并行计算是一种计算方案,它尝试使用多个执行并行算法的处理器更快速的解决问题顺序算法与并行算法并行性与并发性并行算法只识别可并行执行的任务。CPU系统中,并发性是通过多任务处理来实现的线程线程的原理某进程同一地址空间上的独立执行......
  • yzy第七周学习笔记
    第四章并发编程4.1并行计算导论Linux环境中有很多应用程序和很多进程,其中最重要的是客户端网络/服务器。多进程服务器是指当客户端发出请求时,服务器使用子进程来处理客户端的请求。父进程继续等待来自其他客户端的请求。这种方法的优点是服务器可以在客户端请求时管理客户......
  • 学习笔记七
    学习笔记七一、作业要求自学教材第4章,提交学习笔记(10分),评分标准如下知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题”核......
  • 阅读笔记5
    领域驱动设计的最佳实践领域驱动设计(DDD)有一些最佳实践,可以帮助您更好地应对软件核心复杂性:建模与沟通:建立共享的领域模型,确保开发团队和领域专家之间的共同理解。使用通用语言来描述领域对象和操作。持续演化:领域模型是一个持续演化的过程。随着对业务需求的深入了解,不断改进和......
  • uboot中am335x的relocate分析--Apple的学习笔记
    一,前言今天我主要先分析下bbblack的relocate。至于为什么要分析这块内容,因为我个人理解,内存分布也是重要内容,最关键的是这些内容我3年前分析过TQ2440的,但是没分析过bbblack的,所以补上。二,实践先在board_f.c中添加#define_DEBUG1就支持debug函数打印信息了。U-Boot2023.10(Oc......
  • 2023-2024-1 20211306 密码系统设计与实现课程学习笔记7
    20211306密码系统设计与实现课程学习笔记7任务详情自学教材第4章,提交学习笔记知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题......
  • Linux第4章学习笔记
    第四章学习笔记并发编程并行计算导论早期,大多数计算机只有一个处理组件,称为处理器或中央处理器(CPU)。受这种硬件条件的限制,计算机程序通常是为串行计算编写的。并行计算是一种计算方案,它尝试使用多个执行并行算法的处理器更快速地解决问题。顺序算法和并行算法并行性与并发......
  • 数字图像处理实验笔记
    实验一数学形态学图像处理实验内容与要求使用结构元素函数strel分别定义'square'和'disk'形状的结构元素,对下图(a)所示的二值图像进行腐蚀(imerode)和膨胀(imdilate)操作,分析腐蚀和膨胀运算的作用。结合腐蚀和膨胀运算,使用开运算(imopen)和闭运算(imclose),对下图(b)所示的二值图像进行开运......
  • 第四章学习笔记
    第四章学习笔记第四章并发编程本章论述了并发编程,介绍了并行计算的概念,并指出了并行计算的重要性;比较了顺序算法与并行算法,以及并行性与并发性;解释了线程的原理及其相对于进程的优势;介绍了Pthread中的线程操作,包括线程管理函数,互斥量、连接、条件变量和屏障等线程同步工具;解释......
  • 作笔记tips
    将项目目录结构作笔记有时候需要输出,项目的目录结构,比如js文件夹下的a.js项目目录下打开cmd,输入tree,这时就能复制这个目录结构了C:...>treeE:.├─.hbuilderx├─pages│├─category│├─home│├─index│└─mine├─static└─unpackage└─dis......