拓扑排序的实现

2023-05-16

拓扑排序的定义:
在这里插入图片描述
实现思路:

  1. 首先设置一个队列专门存储入度为0的点,同时用vector建立邻接链表;
  2. 将邻接链表建立完成之后,首先选取入度为0的点加入队列中;
  3. 当队列不为空时,逐个弹出入度为0的点,删除该点指向其它点的所有边,同时被指向的点的入度也会减一,当该点的入度减为0时,也会加入队列中,不断搜索直至队列为空为止。这样就可以保证指向点永远排在被指向点之前——因为它先进入队列,而队列是先入先出的;
  4. 同时,可以计算入度为0点的总数,若总数小于点数,说明该图中存在有向无环图。

核心代码:

        for(int i=0;i<nump;i++){
            //将入度为0的点加入队列中
            if(in[i] == 0){
                q.push(i);
                zerop++;
            }
        }
        while(!q.empty()){
            int x = q.front();q.pop();
            //将0入度点指向其余点的边删除,被指向的点的入度减1
            for(int i=0;i<edge[x].size();i++){
                int next = edge[x][i];
                in[next]--;
                if(in[next]==0){  //加入新的0入度点
                    q.push(next);
                    zerop++;
                }
            }
        }

例题:
在这里插入图片描述
代码:

/*拓扑排序:依次找出入度为0的点,最终判断该结构中是否存在有向无环图*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;

queue<int> q;  //存储入度为0的点
vector<int> edge[501];  //邻接链表
int in[501];  //记录每个点的入度
int nump,nume;  //点数和边数
int zerop;  //记录0入度点的总数,若没有有向无环图,则等于所有点数
int main()
{
    while(scanf("%d %d",&nump,&nume)!=EOF && nump!=0 && nume!=0){
        //对上一轮残留进行清理
        while(!q.empty()){
            q.pop();
        }
        for(int i=0;i<nump;i++){
            edge[i].clear();
        }

        for(int i=0;i<nume;i++){
            int a,b;
            //a指向b,b的入度增加
            scanf("%d %d",&a,&b);
            edge[a].push_back(b);
            in[b]++;
        }
        for(int i=0;i<nump;i++){
            //将入度为0的点加入队列中
            if(in[i] == 0){
                q.push(i);
                zerop++;
            }
        }
        while(!q.empty()){
            int x = q.front();q.pop();
            //将0入度点指向其余点的边删除,被指向的点的入度减1
            for(int i=0;i<edge[x].size();i++){
                int next = edge[x][i];
                in[next]--;
                if(in[next]==0){  //加入新的0入度点
                    q.push(next);
                    zerop++;
                }
            }
        }
        if(zerop == nump){
            cout<<"YES"<<endl;
        }else{
            cout<<"NO"<<endl;
        }
    }
    return 0;
}
/*
示例输入:
3 2
0 1
1 2

2 2
0 1
1 0
输出:
YES
NO
*/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拓扑排序的实现 的相关文章

随机推荐

  • 如何在 Ubuntu 20.04 上安装 Spotify

    本文最先发布在 xff1a https www itcoder tech posts how to install spotify on ubuntu 20 04 Spotify是一个音乐流媒体服务商 xff0c 它可以让你和无数的歌曲亲密
  • SSH 操作实践指南

    本文最先发布在 xff1a https www itcoder tech posts ssh practice SSH 是我们经常要和远程服务器交互使用的工具 下面是一些实践中总结的 SSH 操作经验 xff1a 一 如何选择 SSH ke
  • 如何在 Ubuntu 20.04 上安装 R

    本文最先发布在 xff1a https www itcoder tech posts how to install r on ubuntu 20 04 R 是一门开源编程语言和自由的环境 xff0c 主要用于统计分析 绘图 它由 R 基金会
  • 如何在 Ubuntu 20.04 上安装 Mono

    本文最先发布在 xff1a https www itcoder tech posts how to install mono on ubuntu 20 04 Mono 是一个平台 xff0c 基于 ECMA ISO 标准 xff0c 用于开
  • 如何在 Ubuntu 20.04 上安装和使用 Composer

    本文最先发布在 xff1a https www itcoder tech posts how to install and use composer on ubuntu 20 04 Composer 是一个 PHP 依赖管理器 xff08
  • 3分钟在线开通优惠费率的微信支付商户号(商户收款码)

    1 问 xff1a 为什么要开通微信商户号 xff1f 答 xff1a 因为微信个人收款 xff0c 不支持信用卡支付 xff0c 无法提供经营报表 xff0c 无法支持线上支付等 关于微信个人收款码与商家码区别 xff0c 参考 xff1
  • 设置git使用vimdiff比较差异

    原文 xff1a http hi baidu com drdr blog item 57de1e95665a81047af48062 html 修改git的如下2条配置 xff1a git config global diff tool v
  • YUV图像格式

    原文 xff1a http blog csdn net zhongnanjun 3 article details 3934938 YUV xff08 亦称YCrCb xff09 是被欧洲电视系统所采用的一种颜色编码方法 xff08 属于P
  • mime types 大全--来自ubuntu /etc/mime.types

    MIME TYPES and the extensions that represent them The format of this file is a MIME type on the left and zero or more fi
  • VUE3中运用axios处理后端数据

    xff08 1 xff09 在src下新建一个http文件夹 xff0c 文件夹下新建一个index js xff08 2 xff09 在index js文件中引入axios xff08 3 xff09 在index js里面写axios实
  • leveldb性能调优

    许多的nosql都使用leveldb或者类似leveldb的系统作为存储引擎 xff0c 例如tair xff0c hbase xff0c canssandra xff0c 因此理解并调优存储引擎可以大大的提高系统的性能 前一篇大致介绍了原
  • Android 重启 不开机 Backtrace 分析

    此文摘自 mtk online Android 在发生crash 时可以通过 backtrace 定位发生的的位置 xff0c 方便进一步来 fix issue 1 Java Backtrace 从Java Backtrace 我们可以知道
  • SQL Server 2016 OPENJSON忽略大小写

    使用WITH子句OPENJSON将输入JSON表达式中的键与该WITH子句中的列名进行匹配 xff0c 是区分大小写 xff0c 可以使用条件聚合以忽略大小写 xff1a DECLARE 64 JSON varchar max 61 39
  • 论文解读:自适应参数控制方案介绍——Effect Assessment

    Adaptive Probabilities of Crossover and Mutation in Genetic Algorithms TCYB 1994 动机自适应 p c p c
  • SHELL自动化运维

    第1章 shell脚本 1 1 shell 简介 shell 的定义 xff1a span class token number 1 span 在计算机科学中 xff0c Shell就是一个命令解释器 span class token nu
  • iOS tableView cell高度自适应 两种方法

    最近在开发遇到cell高度不确定的情况 xff0c 主要原因是cell里面的label的高度是不确定 从而导致cell高度不确定 我找到了两种解决方案 第一种 利用iOS8的新特性 xff0c 自动计算cell的高度 第二种 自己计算每个c
  • Mysql:is not allowed to connect to this MySQL server

    Mysql is not allowed to connect to this MySQL server 如果你想连接你的mysql的时候发生这个错误 xff1a ERROR 1130 Host 39 192 168 1 3 39 is n
  • 编程题#5:细菌实验分组 C语言

    先求出繁殖率放到value 100 里 然后用bubble int arraynum int arrayvalue int nn 冒泡排序算法对繁殖率value和培养皿编号num从大到小排序 记录繁殖率高的培养皿个数bignum 从大到小输
  • 【Mysql基础】使用limit限制结果集的位置和大小

    使用下面的语句来限制结果的大小和位置 xff1a SELECT FROM table LIMIT offset rows rows OFFSET offset LIMIT 子句 指定SELECT 语句返回指定的记录数 LIMIT 接受一个或
  • 拓扑排序的实现

    拓扑排序的定义 xff1a 实现思路 xff1a 首先设置一个队列专门存储入度为0的点 xff0c 同时用vector建立邻接链表 xff1b 将邻接链表建立完成之后 xff0c 首先选取入度为0的点加入队列中 xff1b 当队列不为空时