拓扑排序

拓扑排序例题 不懂的看这里 拓扑排序 以下是例题: 拓扑排序·一 简单拓扑判环 #include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 7; vector<int> G[maxn]; int inDeg[maxn]; int n,m; queue<int>q; int sum; bool top(... 阅读详情

拓扑排序是指:

  • 一个二维数组或vector<int> edge[50]代表从E->A的边,方便消除E后寻找到A点;

  • int[50]数组装节点的入度多少

  • 优先队列(平常从大到小,priority_queue<int,vector<int>,greater<int> > q,相反,从小到大)多用于字典序的排列

  • 然后寻找入度为0的点,同时减少指向点的入度值(-1),判断(in[ ] == 0)入队和出队。(vector 装出队信息)

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
vector<int>edge[30010],ans;
priority_queue<int>q;//从大到小
int in[30010];
int T,n,m;
void init()
{
    for(int i=1;i<=n;i++)
    {
        edge[i].clear();
        in[i]=0;
    }
    while(!q.empty())
    {
        q.pop();
    }
    ans.clear();
}
void solve()
{
    int i,j;
    for(i=1;i<=n;i++)
        if(in[i]==0)
        {
            q.push(i);
        }

    while(!q.empty())
    {
        int p=q.top();
        q.pop();
        ans.push_back(p);
        for( i=0; i<edge[p].size(); i++ )
        {
            int v=edge[p][i];
            in[v]--;
            if(in[v]==0)
            {
                q.push(v);
            }

        }
    }
    for(i=ans.size()-1;i>0;i--)
    {
        printf("%d ",ans[i]);//Presentation Error 输出错误 最后多输出了个空格
    }
    printf("%d\n",ans[0]);
}
int main()
{
    int a,b;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        init();
        while(m--)
        {
            scanf("%d%d",&a,&b);
            edge[b].push_back(a);
            in[a]++;
        }
        solve();
    }
    return 0;
}

 

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf=1e9;
const int maxn=1e6+5;
vector<int>edge[50];//二维数组的使用;
int in[50];
int main()
{
    char s[5];
    set<int>k;
    while(cin>>s)//E->A A->S S->Y
    {
        k.insert(s[2]-'A');//E 0 ; A 1 ; S 1 ; Y 1;
        k.insert(s[0]-'A');
        if(s[1]=='>')//E>A
        {
            in[s[2]-'A']++;//edge[E]=A; 从E到A的边
            edge[s[0]-'A'].push_back(s[2]-'A');//边的连接;
        }
        else
        {
            in[s[0]-'A']++;
            edge[s[2]-'A'].push_back(s[0]-'A');
        }
    }
    //按字典序排序输出;
    priority_queue<int,vector<int>,greater<int> >q;//从小到大的优先级队列,可将greater改为less,即为从大到小
    //priority_queue<int> qi;//普通的优先级队列,按从大到小排序
    for(int i=0;i<30;i++)
    {
        if(in[i]==0 && k.count(i)!=0)//用来查找set中某个某个键值出现的次数,这样就变成了判断某一键值是否在set出现过了
            q.push(i);
    }
    vector<int>ans;
    while(!q.empty())
    {
        int p=q.top();
        q.pop();
        ans.push_back(p);
        for(int i=0;i<edge[p].size();i++)//点射到其他点的边数
        {
            int y=edge[p][i];
            in[y]--;
            if(in[y]==0) //&& k.count(y)!=0)
                q.push(y);//按从小到大的字典序排序输出;
        }
    }
    if(ans.size()==k.size())
    {
        for(int i=0;i<ans.size();i++)
            printf("%c",ans[i]+'A');
        printf("\n");
    }
    else printf("No Answer!\n");
    return 0;
}

 

【数据结构】什么是拓扑排序—关于图的拓扑排序 ​对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列。拓扑排序:对一个有向图构建拓扑序列的过程。 ​ 阅读详情

相关推荐

思科模拟器Cisco Packet Tracer交换机的管理配置

一、交换机的管理方式:带内管理和带外管理 通过交换机的 Console 端口管理交换机属于带外管理;这种管理方式不占用交换机的网络端口,第一次配置交换机必须利用 Console 端口进行配置。 通过 Telnet、拨号等方式属于带内管理。 二、控制台配置思科交换机 1.新建拓扑图 新建拓扑,选择console线连接交换机和PC,一端接交换机的console口,一端接PC的RS 232 口(...

qq_37992321的博客 2万+

拓扑排序(链式前向星建图法 + vector嵌套法)

拓扑排序 定义: 拓扑排序指的是有向无环图所有顶点的线性序列 该序列需满足俩个条件: 每个顶点只出现一次 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面 有向无环图(DAG图)才有拓扑排序,且可能不止一种排序,其他的无拓扑排序一说 应用 拓扑排序通常用来“排序”具有依赖关系的任务。 比如,如果用一个DAG图来表示一个工程,其中每个顶点表示工程中的一个任务,用有向边表示在做任务 B 之前必须先完成任务 A。故在这个工程中,任意两个任务要么具有确定的先后关系,要么是没

Suryxin's blogs 744

实现自己的AI视频监控系统-第一章-视频拉流与解码4(重点)

使用本章节代码请引用此优快云链接,尊重知识、尊重他人劳动。这一小节将正式进入代码实现部分。我们会结合实际业务需要和拉流解码流程实现一个灵活、轻便、易用的视频拉流解码模块,支持多路视频拉流解码且可以动态更新更新内部参数。在开始设计之初,我们首先考虑的是使用大家所熟知的 **OpenCV(cv2.VideoCapture)**来实现拉流和解码功能。它的 API 简单直接,几行代码就能实现从网络流中读取帧,对于快速原型验证来说非常方便。然而,在经过深入的调研和测试后,我们发现 OpenCV 在处理多路视频流、追

soulproficiency的博客 2268

leetcode+拓扑排序,vector存储图就能过了,问号?

点击打开链接#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string&gt; #include &lt;cstring&gt; #include &lt;string.h&gt; #include &lt;algorithm&gt; #include &l

小堃哥的专栏 271

DeepSeek-OCR又更新:一起看下OCR1和OCR2

DeepSeek-AI 最近又又开源了,这次是DeepSeek-OCR2,结合之前发布的DeepSeek-OCR ,可以发现DeepSeek走出了一条不同于主流 OCR 方案的技术路线。第一代模型探索了**“视觉作为文本压缩介质”的可行性,打破了传统的序列长度限制;第二代模型则通过“Visual Causal Flow(视觉因果流)”**架构,将因果推理引入视觉编码器,解决了复杂排版下的阅读顺序难题。本文将从架构设计、逻辑结构、训练范式及工程实现四个维度,深度剖析这两代模型的异同与创新。

kakaZhui的博客 622

VScode利用EIDE和cortex-debug进行stm32开发(也适用51)

你是否因为keil页面太丑而烦恼,你是否因为keil编译太慢而恼怒,ok阿,今天也是给大家带来怎么在vscode上进行stm32的编程(我不会告诉你,我搞了好几天才搞好的💔💔💔)为什么是简单介绍?因为太啰嗦了,我嫌麻烦😋,大家可以去EIDE的官方文档去看。

weixin_73952614的博客 9381

拓扑排序的vector

#include <bits/stdc++.h>#define inf 1e9#define lll long long intusing namespace std;vector <int> q[100]; int n,rudu[100],p,ans[100],k;bool f[100];queue <int> qq;void tuopu(){wh...

anxun0797的博客 277

CST毫米波雷达ADAS仿真:从直角反射器到距离多普勒(RD图)的实战解析

本文通过CST Studio Suite实战解析毫米波汽车雷达ADAS仿真,详细演示了从构建直角反射器目标、参数化定义速度、进行参数扫描到生成距离多普勒图(RD图)的全过程。文章深入探讨了雷达关键参数(如距离分辨率、速度分辨率)的设计权衡与工程逻辑,并提供了单位统一、速度范围设定等实用避坑指南,帮助工程师高效完成雷达系统性能的前期验证与优化。

weixin_29292535的博客 502

拓扑排序+BFS+vector的使用

#include #include #include #include #include #include #include #include #include #include #define LL long long #define inf 0x3f3f3f3f #define mod 1e9+7 using namespace std; const int maxn=1e

小堃哥的专栏 595

手把手教你用Python实现双三次插值(附OpenCV对比测试)

本文深入解析了双三次插值算法的数学原理,并提供了从零开始的Python实现教程。通过与OpenCV官方实现的对比测试,详细评估了不同插值算法(包括最邻近差值、双线性插值)在图像质量与计算性能上的差异,帮助开发者掌握高质量图像缩放的核心技术。

weixin_29310605的博客 293

ISP算法:宽动态HDR

动态范围(Dynamic Range):在很多领域来表示某个变量的最大值和最小值的比值。在数字图像处理领域里,动态范围也被称为图像对比度,表示图像可以显示范围内,像素最大亮度值和最小亮度值的比值。 高动态范围图像(High Dynamic Range Image): 可以反映真实场景中高动态范围亮度信息图像。 高动态技术:能自动调整图像动态范围的一种技术。该技术是一种利用计算机高速运算产生高

a200800170331的专栏 1万+

hpu 2647 拓扑排序 + vector不定长数组的使用方法

在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结。 1 基本操作 (1)头文件#include. (2)创建vector对象,vector 数组名[MAX]; (3)尾部插入数字:vec.push_back(a); (4)使用下标访问元素,cout (5)使用迭代器访问元素. vectorint>::iterator it; for(it=vec.begi

hpugym的专栏 581

AUTOSAR进阶图解==>AUTOSAR_EXP_CDDDesignAndIntegrationGuideline

本文档提供了AUTOSAR架构中复杂驱动(CDD)的设计与集成指南。CDD作为非标准化的软件实体,位于复杂驱动层,实现传感器评估、执行器控制、微控制器访问等特殊功能。文档详细阐述了CDD的架构特点、设计建议(包括文档要求、文件结构、接口描述等)以及与其他模块(RTE、库、标准BSW等)的集成方式。特别强调了CDD在多核系统和MCAL层中的实现考量,为开发人员提供了从文档规范到代码实现的全方位指导,确保CDD在保持AUTOSAR兼容性的同时满足特殊功能需求。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1886

拓扑排序的原理及其实现

本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件和离散数学中偏序/全序概念的联系典型实现算法 Kahn算法基于DFS的算法 解的唯一性问题实际例子 取材自以下材料: http://en.wikipedia.org/wiki/Topological_sorting http://en.wikipedia.org/wiki/Hamiltonian_pat

不忘初心,好好沉淀 21万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

拓扑排序详解

拓扑排序是一种用于有向无环图(DAG)的排序算法,它按照节点之间的依赖关系对节点进行排序,确保任何一个节点在排在其依赖节点之后。这种排序常用于任务调度、编译顺序等场景。今天就让我们来深入理解一下。

2301_80035594的博客 2348

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

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

拓扑排序详解及C++实现

介绍拓扑排序的定义、逻辑,包含完整的模拟过程和C++代码实现,及拓扑排序判环。拓扑序列:对于一个有向无环图将图中的顶点排成一个序列,其中每个边的起点在序列中一定在终点之前;通俗解释为:将一张图“压扁”,使顶点从左到右排成序列,且压扁后每条边的方向只能朝右,那么这个序列是这张图的拓扑序列。 拓扑排序就是求解一张有向无环图拓扑序列的过程。

一直爱算法的猫的博客 5982

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

有向图拓扑排序

有向图拓扑排序 前言 本文介绍有向图拓扑排序算法的思路及代码实现,首先讲解什么是拓扑排序,其次介绍实现拓扑排序需要的检测有向图是否有环的算法及顶点排序算法,最终实现有向图的拓扑排序。 一、什么是拓扑排序? 给定一副有向图,将所有的顶点排序,使得所有的有向边均从排在前面的元素指向排在后面的元素,此时就可以明 确的表示出每个顶点的优先级。如对下图进行拓扑排序: 拓扑排序结果为: 根据拓扑排序的概念,如果对有向图进行拓扑排序,那么图中必须没有环,否则,就不能进行拓扑排序,然后在图中无环的情况下,再进行顶点排

Mekeater的博客 1万+

什么是拓扑排序

一、什么是拓扑排序 在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件: 每个顶点出现且只出现一次。 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。 例如,下面这个图: 它是一个 DAG 图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法:..

哦,原来你也在这里。 8251

拓扑排序及算法实现

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

ShyTan的博客 1万+

拓扑排序算法

用unordered_map就比较万能了,完全像刚才想象出来的邻接表结构,我们这里是一个int的数后面挂了一个int数组,那不就和一个节点挂着一个节点的效果一样的吗。我们可以把给的信息抽象称一张有向图,题目问能否完成所有课程学习意思就是能不能把这个课程排个序,说白了就是能否拓扑排序,能否拓扑排序也就是是否这个图是否是有向无环图 —> 有向图中是否有环?,有向图就是边都是有方向的。直接对图来一次拓扑排序,当拓扑排序过程中发现没有入度为0的点的时候,但是图中还有剩余点的时候,此时这个图中一定会有环形结构。

2301_80224556的博客 1749

拓扑排序概念

拓扑排序,顾名思义,就是一种排序方法。这是一种什么排序?这种排序的作用?然后怎么去实现这种排序算法?现在就让我们仔细研究下。 1、什么是拓扑排序,也就是拓扑排序的概念 实际上,拓扑排序是一种图论算法,该算法在《数据结构与算法》一书中有涉猎。引用维基百科的定义: 在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological sorti...

MinisterZ的博客 8191

图的拓扑排序

算法思想 按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系,由此所得顶点的线性序列称之为拓扑有序序列。显然对于有回路的有向图得不到拓扑有序序列,因为有回路的话,顶点的先后次序就不确定了。 例如,下图,我们可以人为限定次序:A B C D 或 A C B D 如何进行拓扑排序? 从有向图中选取一个没有前驱(没有在它之前活动)的顶点,输出之; 从有向图中删去此顶点以及所有以它为尾的弧; 重复上述两步,直至图空,或者图不空但找不到无前驱的顶

ChanCherry的博客 3255

【Java】拓扑排序

java实现拓扑排序

rellvera的博客 3570

有向图的拓扑排序

若排序后满足,图中的任意一条有向边(u, v),u的位置都在v的前面,则称为拓扑排序该图的拓扑排序为A B C D,AC 边A在C的前面,BC边BZ在C的前面.......所有边都满足定义。

shallrelow的博客 1038
上一篇: 邻接矩阵( 二维数组指定定义 )
下一篇: 最大连续子序列和
while_black
博客等级 码龄9年 25粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值