拓扑排序简介+hdu4857逃生(逆向建图+拓扑排序)

基于深度学习的故障检测算法实战:从数据切窗到模型部署全流程 时序异常检测是工业智能化的核心技术,其原理是通过深度学习模型自动学习正常数据分布,偏离即报警。技术价值在于替代人工阈值,提升故障早期识别率与泛化能力。典型应用于旋转机械、电力变压器等场景。基于深度学习的故障检测算法结合CNN与自编码器,覆盖数据切窗、标签构造、模型选型及阈值设定,实现从振动信号到报警的端到端落地。 阅读详情

拓扑排序

简介

  • 将有向图中的顶点以线性的方式排序,在任何连接自顶点u到v的有向边uv,在最后排序的结果中u总在v之前。(有向无环图)

思想

  1. 从有向图中选取一个入度为0的顶点,输出。
  2. 删除该顶点,包括关联的所有边。
  3. 直到图空或者找不到入度为0的点。
  4. 每次的选择只能是唯一或者不确定,不能有矛盾的情况。

模板

    #include <stdio.h>
    #include <set>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    #include <iostream>
    #define maxn 30010
    using namespace std;

    int n,m;  
    int indegree[ maxn ];
    vector< vector<int> > G(maxn);       //存储关系 
    set<int> s;             
    int ans[maxn];                       //最终的顺序 

    void init(int n)
    {
        memset(indegree,0,sizeof(0));
        s.clear();
        for(int i = 1; i <= n ; i++)
            G[i].clear();
        memset(ans,0,sizeof(ans));
    }

    int toposort()
    {
        int i,pos=0;

        //按照题目应该先加入最大的 
        for(i = n; i >= 1 ;i--)
            if(indegree[ i ] == 0)
                s.insert( i );

        while ( !s.empty() )
        {
            i = *s.begin();
            ans[++pos]=i;
            s.erase( s.begin() );

            //删除掉这个点,并且把所有连接边删除,其他点的入度也要改变 
            while ( !G[ i ].empty() )
            {
                //G[i]的出边的点的入度减1 
                indegree[G[i].back()] --;

                //入度为0了 加入set 
                if(indegree[G[i].back()] == 0)
                    s.insert(G[i].back());

                G[i].pop_back(); 
            }
        }

        if (pos==n)
            return 1;
        else
            return 0;
    }
    int main()
    {
        int T,i;  
        scanf( "%d", &T );
        while ( T-- )
        {      
            scanf("%d%d",&n,&m);
            init(n);

            //读入关系 
            while(m--) 
            {
                int i,j;
                scanf("%d%d",&i, &j);

                //不重复加载 
                if(find(G[i].begin(),G[i].end(),j) == G[i].end())
                {
                    G[i].push_back(j);
                    indegree[j]++;  
                }    
            }   

            //拓扑排序 
            toposort();   

            for (i=1;i<=n;i++)
                printf("%d ",ans[i]);
            printf("\n");
        }

        return 0;
    }  


例题(逆向建图+拓扑排序)

hdu4857逃生

思路:

  • 如果按照普通的拓扑排序,正向建图,每次选取入度为0的最小的点(小根堆),那么看似可以,但是题目要我们尽量把题号最小的放到前面输出。那么也就是说5->4->1和3->2,我们也应该是输出5->4->1后,再考虑2和3,因为1的优先级太高了,我们想尽可能快得输出1,所以就要把1之前的统统先输出。

  • 那么就不能按照通常的方法。我们考虑逆向建图,那么在有多个入度为0的顶点时,我们选择数字大的点。为什么?假设现在是3和5的入度为0,那我们肯定想的是,最终结果中3要最先输出,那么我们现在就要把5放到3后面输出,因为后面我们会逆序输出,所以现在就让5加入大根堆,同时删除与5关联的边。那么这样每次选择大的,放到前面,那么之后逆序肯定是在后面。

AC代码:


    #include <stdio.h>
    #include <set>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    #include <iostream>
    #define maxn 30010
    using namespace std;

    int n,m;  
    int indegree[ maxn ];
    vector< vector<int> > G(maxn);       //存储关系 
    set<int,greater<int> > s;            //按照题目应该是大根堆 
    int ans[maxn];                       //最终的顺序 

    void init(int n)
    {
        memset(indegree,0,sizeof(0));
        s.clear();
        for(int i = 1; i <= n ; i++)
            G[i].clear();
        memset(ans,0,sizeof(ans));
    }

    int toposort()
    {
        int i,pos=0;

        for(i = 1; i <= n ;i++)
            if(indegree[ i ] == 0)
                s.insert( i );

        while ( !s.empty() )
        {
            i = *s.begin();
            ans[++pos]=i;
            s.erase( s.begin() );

            //删除掉这个点,并且把所有连接边删除,其他点的入度也要改变 
            while ( !G[ i ].empty() )
            {
                //G[i]的出边的点的入度减1 
                indegree[G[i].back()] --;

                //入度为0了 加入set 
                if(indegree[G[i].back()] == 0)
                    s.insert(G[i].back());

                G[i].pop_back(); 
            }
        }

        if (pos==n)
            return 1;
        else
            return 0;
    }
    int main()
    {
        int T,i;  
        scanf( "%d", &T );
        while ( T-- )
        {      
            scanf("%d%d",&n,&m);
            init(n);

            //读入关系 
            while(m--) 
            {
                int i,j;
                scanf("%d%d",&i, &j);

                //不重复加载 逆向建图 
                if(find(G[j].begin(),G[j].end(),i) == G[j].end())
                {
                    G[j].push_back(i);
                    indegree[i]++;  
                }    
            }   

            //拓扑排序 
            toposort();   

            //逆向输出 
            for (i=n;i >= 1;i--)
            {
                if(i == 1)
                    printf("%d\n",ans[i]);
                else 
                    printf("%d ",ans[i]);
            }
        }

        return 0;
    }  
Unsloth Desktop 本地大模型微调量化实战指南 大语言模型的本地化定制正在成为开发者与内容创作者的重要需求,而微调与量化则是其中最关键的两项技术。LoRA 与 QLoRA 通过仅训练少量低秩矩阵,大幅降低显存占用和训练成本,让消费级 GPU 也能完成模型适配;GGUF 格式则打通了训练与推理的边界,使微调后的模型可直接接入 Ollama、llama.cpp 等主流推理引擎。本文以 Unsloth Desktop 为切入对象,从其底层加速原理出发,梳理了环境准备、模型加载、对话测试、量化导出、微调验证及 API 批量调用的完整链路,并针对显存优化、端口冲突 阅读详情

相关推荐

51单片机-点亮LED和蜂鸣器

ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。ULN2003是大电流驱动陈列,多用于单片机、只能仪表、PLC、数字量输出卡等控制电路中。可直接驱动蜂鸣器、继电器等负载。void delay(u16 i) // i等于1大约10uswhile(i--);//取反,高低电平不断变化,产生脉冲delay(10);// 周期200us。

三日沐水 1125

HDU-4857逃生(反向拓扑排序)(重点是思想)

题意:有N个人,M个优先级a,b表示a优先于b,并且每个人有个编号的优先级,输出顺序。 这道题一看也许你就知道是拓扑排序,但是这个和普通 的拓扑有些不一样!! 先来看看拓扑的讲解(做此题的时候我还不会拓扑)、 拓扑排序的原理及其实现 刚开始我就是用普通的拓扑排序+优先队列 让队列中最小的先出队~ 当时我觉得没有什么不对! 附上代码: #include #

wjhshuai的博客 516

使用LoRa远程控制路灯(PWM调光以及LoRaWAN单播、组播、广播)

PWM调光 1、使用有pwm波输出的引脚,本例子使用timer0,PA0引脚; 2、由于timer时钟的原因,mcu不能进入休眠; 3、主控使用EFM32,代码实现如下: #define MAX_PULSE (CPU_FREQ/1000-1) #define UNIT_PULSE MAX_PULSE/100 //单位脉宽 void pwminit(void) { ...

freemote的博客 2944

HDU-#4857 逃生(拓扑排序)

题目大意: 解题思路: 题目来源: ci

VoidSun 588

光伏发电系统模拟及其发电预测开源python工具pvlib

本文介绍光伏发电系统模拟及其发电预测开源python工具pvlib,以及举例介绍获取辐照度方法、光伏发电预测思路。

肖永威的专栏 1万+

阿里云大模型ACP认证模拟考试(二)

摘要:在阿里云大模型高级工程师 ACP 认证暂无真题题库的现状下,模拟题具有重要意义。其依照真实考试设计,涵盖题型、题量与分值分布,助力考生熟悉考试框架,合理分配答题时间精力,提升效率。同时,模拟题紧扣官方课程,能帮助考生精准定位知识盲点,如大模型架构原理和通义千问应用实践等重点内容,以便针对性完善知识体系。此外,通过练习模拟题,考生可掌握不同题型的解题思维与技巧,快速洞察复杂题目本质,提高答题准确率。

davidkorhenn的博客 2070

hdu 4857 逃生 (拓扑排序+保证最小在前面)

逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 74    Accepted Submission(s): 13 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的通道很

To be what you what to be! 3951

【Apollo学习笔记】——规划模块TASK之SPEED_HEURISTIC_OPTIMIZER

在Apollo星火计划学习笔记——Apollo路径规划算法原理与实践与【Apollo学习笔记】——Planning模块讲到……Stage::Process的函数会依次调用task_list中的TASK,本文将会继续以LaneFollow为例依次介绍其中的TASK部分究竟做了哪些工作。由于个人能力所限,文章可能有纰漏的地方,还请批评斧正。在配置文件中,我们可以看到LaneFollow所需要执行的所有task。本文将继续介绍LaneFollow的第10个TASK——动态规划规划目标加速度尽可能小。

sinat_52032317的博客 3425

hdu-4857-逃生-拓扑排序

拓扑排序。 反向建边。 为了序号小的尽量在前面,我们每次都取出入度为0的最大的点。 #include #include #include #include #include #include #include #include using namespace std; struct list { int u,v,w; int next; }edge[110000]; int

青竹梦 2389

STM32 Nucleo-144开发板开箱bring-up

最近做项目,用到STM32F446ZET6这款MCU,为了赶进度,前期软件需要提前开发,于是在某宝买了对应主控的官方开发板,为了避免遗忘,后面能翻出来回忆一些细节,就形成了本篇的主要内容,同时也希望能够帮助刚上手的小伙伴少走弯路,如果对你有帮助请点赞、收藏、转发,谢谢!

汽车电子软件领域知识分享 2674

小土堆学习笔记1:Dataset类代码实践

上一页中反复提到“类”,这究竟是什么东西?按我的理解(肯定不准确也不正式),class类就是某一个东西的共性,而且是等待被确认的共性。比如每台手机都有它自己的品牌、框架、价格等等属性,class类正是这些尚不确定的属性;而一旦确认了这些属性,就能够确认这到底是一台什么型号什么状态的手机,在确认了全部属性后就知道,这是一台Apple 16 Pro Max。抽象的不确定的共性就是类,具体的确定的个性就是示例。这个共性可以被用于多个编程目的,只不过某一个具体的编程行为还有它自己的独特性。

qq_40525602的博客 1625

【ACM】- HDU-4857 逃生 【拓扑排序】

题目分析 题目对于当有多种排序情况时如何处理没有说得太清楚;并不是每两个可以换序的顶点都要保证编号小的靠前,而是在优先保证1号更靠前的前提下再考虑2号更靠前; 参考博客 解题思路 结点比较多,邻接表存储; 优先级队列不能用大顶堆,会WA;(当有平行路径时可能出错) 正确做法:把图逆序,最后输出也逆序,priority_queue&lt;&gt;用原始的大顶堆(即每次选择编号较大的入队)...

三个石头 308

【思博伦】史上最详细Spirent TestCenter测试仪使用教程精讲(一)!图解超赞超详细!!!

3. 在弹出的界面中,找到菜单栏中的“Connect/Create”,选择下拉框中的“Connect to Physical/Visual Chassis”,在弹出的对话框中输入思博伦测试仪的IP地址:192.168.6.244,点击“OK”;说明:目前我们只需要使用到Raw Stream Block,不需要用到Bound Stream Block。说明:如果要使用100G模式,由于硬件限制,必须连续3个面板端口同时配置为100G使用。打开安装包,并按照提示按照即可。

风云说通信 6477

【题解】逃生 HDU - 4857 (拓扑排序 反向建图)⭐⭐⭐

逃生 HDU - 4857 糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的通道很窄,大家只能排成一行。 现在有n个人,从1标号到n。同时有一些奇怪的约束条件,每个都形如:a必须在b之前。 同时,社会是不平等的,这些人有的穷有的富。1号最富,2号第二富,以此类推。有钱人就贿赂负责人,所以他们有一些好处。 负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情...

Suprit's blog 1063

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

HDU 4857 - 逃生 题解

问题转化:将"小号尽量靠前"转化为"大号尽量靠后"反向思维:从后往前安排位置,最后反转序列数据结构选择最大堆保证每次选择当前可用的最大编号哈希集合去重避免入度计算错误算法核心:反向拓扑排序 + 最大堆 + 结果反转。

大家好,我是宗嗣令 888

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

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

hdu 4857 逃生 拓扑排序+优先队列,逆向处理

hdu4857 逃生 题目是求拓扑排序,但不是按照字典序最小输出,而是要使较小的数排在最前面。 一开始的错误思路:给每个点确定一个优先级(该点所能到达的最小的点),然后用拓扑排序+优先对列正向处理,正向输出。这是错误的,如下样例: 1 5 4 5 2 4 3 2 1 3 1 正确的解法:是反向建边,点大的优先级高,用拓扑排序+优先队列,逆向输出序列即可。 根据每对限制,可确

冰 1136

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

HDU4857 逃生【逆向拓扑排序】【优先队列】

逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2928    Accepted Submission(s): 817 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的

初涉_代码世界 739

HDU 4857 逃生 (拓扑排序)

Problem Description 糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的通道很窄,大家只能排成一行。 现在有n个人,从1标号到n。同时有一些奇怪的约束条件,每个都形如:a必须在b之前。 同时,社会是不平等的,这些人有的穷有的富。1号最富,2号第二富,以此类推。有钱人就贿赂负责人,所以他们有一些好处。 负责人现在可以安排大家排队的顺序,由于收了好处,所

小坏蛋_千千 1612

拓扑排序 配题(HDU 4857)

给定点的先后出场次序:例如 点 u 出场的前提是点 v 已经出现,那么这就代表了一个约束条件,现在给出很多的约束条件,用程序来给这些点的出场次序排个序,要求满足所有的约束条件问题,这时候用到的就是拓扑排序。 拓扑排序用于有向无环图,如果过要是想判断一个有向图是否存在环,可以使用拓扑排序进行判断(如果提取入度为0的点的个数没有达到所有点的个数,那么就一定出现环了) 有关拓扑排序的输出问题: ...

猫ER 435

逃生 HDU 4857(反向建图 + 拓扑排序)

逃生 链接 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的通道很窄,大家只能排成一行。 现在有n个人,从1标号到n。同时有一些奇怪的约束条件,每个都形如:a必须在b之前。 同时,社会是不平等的,这些人有的穷有的富。1号最富,2号第二富,以此类推。有钱人就贿赂负责人,所以他们有一些好处。 负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽...

做一只熊猫不好吗? 181

hdu 4857 逃生(逆向拓扑排序)(STL应用)

逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5768    Accepted Submission(s): 1692 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命。但是逃命

黑脉金的博客 244

HDU 4857 逃生 (拓扑排序+队列)

传送门 拓扑排序 题意 m组约束,必须保证a在b前面,(数据保证无环),输出顺序。 思路 拓扑排序模板题。 从拓扑这个角度看,排序唯一性的本质就是所有的待排项满足全序关系 思想: 1.拓扑排序要储存每个点的序号以及他的入度和邻边,为节省空间,使用vectoredge[maxn]来储存相应序号的邻边 2.邻边的清空,每选出一个点,要消除所有和他相邻的边,即让他的入度减一即可,若入度为零,则入队列。 代码 int n,m; int num[maxn]; vector<int>edge[maxn];

幼儿园大哥~ 262

hdu 4857 逃生(拓扑排序)

提议:给n个人,他们之间存在前后ji

zizaimengzhongyue的专栏 969

hdu 4857/BestCoder Round#1 1001(拓扑排序+逆向建图)

此题需仔细分析题目,否则题意容易理解错误,应注意下面这种情况 本题意思尽可能让最小的排的靠前,然后次小的尽量靠前,依次下去 如 input: 1 3 1 3 1 output: 3 1 2 解析:我们应让1尽可能的排在前面,然后尽可能的让2排的靠前。。。所以 2 3 1的结果是错误的 思路:拓扑排序(逆向建图+队列)//为解决上述列子,如果我们正向建图,每次

Crazy_Bear 769

HDU 4857 逃生(反拓扑排序)

题目 题意很简单,就是n个结点,m个拓扑关系(a,b)表示a必须排在b前面,在满足m个拓扑关系关系的前提下使得小的结点尽可能的排在前面。也就是说我们现在要从1号结点开始考虑,如果要排1号结点,根据拓扑关系,首先必须排哪些结点,如果排好了1号结点,则继续考虑2号结点 ,3号结点。 我一开始以为就是简单的套模板的拓扑排序,结果提交的时候居然超了,后来看了大佬的代码,这应该用反拓扑排序加优先队列,意外,...

G191018的博客 273

HDU 4857 逃生【逆拓扑排序】

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4857 ★ 一开始看到这题就想到的是dfs,但是感觉会超时,然后就没写 ★看了看别人的题解,说是拓扑排序, 然后我就去了解了一波 相关知识: 详细可见 https://blog.youkuaiyun.com/qq_35644234/article/details/60578189 拓扑排序的方法 Kahn算法...

HungTeen的博客 237
上一篇: HDU6060 RXD and dividing
下一篇: spring实现注册(邮箱验证+有效时间)
WaveBridge
博客等级 码龄10年 8粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值