首页 > 其他分享 >拓扑排序(10/18)

拓扑排序(10/18)

时间:2023-10-18 21:13:06浏览次数:42  
标签:10 排序 idx int 18 拓扑 ++ include

拓扑排序

https://raelum.blog.csdn.net/article/details/129650604?ydreferer=aHR0cHM6Ly93d3cuYWN3aW5nLmNvbS9hY3Rpdml0eS9jb250ZW50L2NvZGUvY29udGVudC80NzEwNi8%3D

 

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 100010;

int n,m;

int h[N],ne[N],e[N],idx=0;

int q[N];int in[N];int tt=-1,hh=0;

void add(int a,int b)
{
    ne[idx]=h[a]; e[idx]=b; h[a]=idx++;
}

bool topsort()
{
    //遍历找入度为0的点存进队列
    for(int i=1;i<=n;i++)
    {
        if(in[i]==0) q[++tt]=i;
    }
    
    while(hh<=tt)
    {
        int t=q[hh++];
        for(int i=h[t];i!=-1;i=ne[i])
        {
            //下一节点的入度减1,即砍去这条边,如果为入度0,就加入队列
            int j=e[i];
            in[j]--;
            if(in[j]==0) q[++tt]=j;
        }
    }
    return tt+1==n;//是tt不是hh,所有元素的下标
}



int main()
{
    memset(h,-1,sizeof h);
    cin>>n>>m;int x,y;
    while(m--)
    {
        scanf("%d%d",&x,&y);
        add(x,y);
        in[y]++;
    }
    
    if (!topsort()) puts("-1");
    else
    {
        for (int i = 0; i < n; i ++ ) printf("%d ", q[i]);
        puts("");
    }
    
    return 0;
}

 

标签:10,排序,idx,int,18,拓扑,++,include
From: https://www.cnblogs.com/daimazhishen/p/17773324.html

相关文章

  • 10.18日记
    //给每个主节点添加点击事件监听器mainNodes.forEach(mainNode=>{  mainNode.addEventListener('click',(e)=>{    //阻止默认链接行为    e.preventDefault();    //切换子菜单的显示状态    constsubMenu=mainNode.next......
  • 10.18
    今日代码:200行今日时间:4小时学习内容:今天做了软件构造的作业小学数学题的编程MathPaper.javapackagecom.stdu.www; importjava.util.ArrayList;importjava.util.List; publicclassMathPaper{  privateList<MathQuestion>questions;   publicMathP......
  • 每日总结20231018
    代码时间(包括上课)3h代码量(行):80行博客数量(篇):1篇相关事项:1、今天上午上的是软件构造,这节课首先是播放的是人工智能方向的未来发展,通过百度的各项研究表明IT行业发展迅速,不能局限于上课的知识。2、后两节讲的是如何用面向对象的知识去写四则运算的程序,然后讲了debug的重要性。3......
  • NOIP2018PJ T3 摆渡车(2023.10第二版题解)
    题目链接 题意:时间轴上分布着$n$位乘客($1\len\le500$),$i$号乘客的位置为$t_i$(0\let_i\le4\times10^6),用互相距离不小于$m$的车次将时间轴分为若干部分,并管辖以自己为右端点的这个区间(除了第一趟车包括$0$,其他车次左开右闭),求最小费用和。每个车次的费用来自:管辖区间内所......
  • 10.16
    今日代码:500行今日时间:4小时学习内容:今天大数据学习了MapReduce知识,人机交互学习了css的选择器知识。写了一下大数据作业词频统计任务编程实践,任务要求:在Linux系统本地创建两个文件,即文件wordfile1.txt和wordfile2.txt,文件wordfile1.txt的内容格式如下,需要将zhangsan换成自己名字......
  • 算法训练day36 1005.134.135.
    算法训练day361005.134.135.1005.K次取反后最大化的数组和题目1005.K次取反后最大化的数组和-力扣(LeetCode)题解代码随想录(programmercarl.com)将数字按绝对值大小排序优先将绝对值最大的负数取反剩余步骤将最小非负数取反注意数组大小顺序,以及处理剩余......
  • 2023/10/18 学习笔记
    VLAN网络vlan——虚拟局域网由于交换机所有的端口都在同一个广播域,只要发送广播会产生大量的垃圾信息,同时会有安全隐患(病毒)。解决这个问题有两种方法:物理解决:需要在交换机之间安装路由器(成本太大)逻辑解决:使用vlan虚拟网络技术vlan的优势:控制广播增强网络安全......
  • 2023/10/18 Java异常处理认识
    异常处理是Java中非常重要的概念之一,它允许开发者在程序运行过程中对可能出现的异常进行捕获、处理和抛出,有效保证程序的稳定性和可靠性。在程序运行过程中,可能会发生各种各样的异常情况,如空指针异常、数组越界异常等。如果不合理地处理这些异常,程序就有可能崩溃或产生不可预知的......
  • 2023.10.17 测试总结
    预计得分:145实际得分:148T1考场上没有想出来,打了一个高精度暴力。问题大概在:1.对哈希算法不熟悉。2.数学上对对数的计算不熟悉。耗时:1hT2暴力。没有挂分,正解属于是难以想到的。耗时:1hT3极为接近正解,但是挂分过多。问题有:1.没有检查出来数组开小了。2.......
  • 10.18每日总结
    将数据库作业写完了,巩固了hive的相关知识;学习了软考的相关知识点;重新捋了捋自己的逻辑;学习了springboot的相关内容;背单词;明天预计将逻辑实现;将部门留下的一篇推文写了;背单词;学习软考;学习新的技术;规划一下;......