『拓扑排序』拓扑排序模板

拓扑排序学习前提须知

拓扑排序是对于一个图的所有节点进行排序,要求排序完后没有一个节点指向它前面的节点,那么这样我们就会得到一个拓扑排序后的数组,我们从后往前扫通过某种计算就能够得到从某一个点开始最多能到多少个点。

算法内容

竞赛需要用到的点

1、拓扑排序仅适用于有向无环图,当然也可以判定是否图为无环图

2、能够得到从一个点能到多少个其他的点,如果n在万以上,处理得当甚至能够过千万

拓扑排序略讲

拓扑排序需要满足一个很重要的条件就是,每次进入答案的点的入度一定为0,那么根据这个条件,我们就能得到我们的拓扑排序后的数组

void toposort() {
    std::queue<int> q; //存储到目前为止入度为0的点
    std::vector<int> ans; //储存答案
    for (int i = 1; i <= n; i++) {
        if(!in[i]) q.push(i); //如果入度为0则加入队列中
    }

    while(!q.empty()) { //简单的搜索
        int t = q.front(); q.pop();
        ans.push_back(t);
        for (int i = head[t]; ~i; i = to[i]) {
            int v = ver[i];
            if(!in[v]) q.push(v);
        }
    }

    for (int i = 0; i < n; i++) { //查看拓扑排序后的数组
        printf("%d\n", ans[i]);
    } return ;
}

原文地址:https://www.cnblogs.com/Nicoppa/p/11549836.html

时间: 2024-11-02 16:56:57

『拓扑排序』拓扑排序模板的相关文章

一般排序算法总结与模板

一般排序算法总结与模板 主要包括冒泡.插入.合并排序和两种二分查找的实现. 冒泡排序: 插入排序: 合并排序: #include <stdio.h> #include <stdlib.h> #include <errno.h> int a[]={223, 34, 23, 2, 21, 55, 87, 533 , 213, 111}; //int a[]={2, 21, 23, 34, 55, 87, 111, 213, 223, 533}; //int a[]={533

Atitit.现实生活中最好使用的排序方法-----ati排序法总结

1. 现在的问题 1 2. 排序的类别::插入排序//交换排序//选择排序(每次最小/大排在相应的位置  )//归并排序//基数排序 1 3. 选择排序法  (垃圾...不好使用) 2 4. 堆排序-(雅十垃圾...不好用) 2 5. 希尔排序法 (雅十垃圾...不好用) 3 6. 冒泡排序法 (雅十垃圾...不好用) 3 7. 快速排序法 (雅十垃圾...不好用) 3 8. 归并排序法 (雅十垃圾...不好用) 3 9. 插入排序法 ( 勉强能使用,要是加个2分寻找走ok兰..) 3 10. 

『Python进阶』专题汇总

基础知识 『流畅的Python』第1~4章_数据结构.编码 『Python』基础数据结构常见使用方法 『Python CoolBook』数据结构和算法_多变量赋值&“*”的两种用法 『Python CoolBook:Collections』数据结构和算法_collections.deque队列&yield应用 『Python CoolBook:heapq』数据结构和算法_heapq堆队列算法&容器排序 『Python CoolBook:Collections』数据结构和算法_容器型

Github 恶搞教程(一起『玩坏』自己的 Github 吧)

最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发现原来有人已经做出『玩坏』Github 的工具啦,名叫 gitfiti.主要对应预先定义的模板,进行相应日期的 commit 操作,push 至 Github 后在贡献栏中生成相应像素点,并且利用 Github 贡献数不同颜色深度不同的机制,就可以在自己的贡献栏里面看见像素画了.怎么样,是不是心动啦,那么下面

排序算法——希尔排序

希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 该方法因DL.Shell于1959年提出而得名. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多, 当增量减至1时,整个文件恰被分成一组,算法便终止. 代码实现 void shellsort(int a[],int n) { int gap=0,i=0,temp=0,j=0; for(

基数排序与桶排序,计数排序【详解】

桶排序简单入门篇^-^ 在我们生活的这个世界中到处都是被排序过的东东.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说排序是无处不在.现在我们举个具体的例子来介绍一下排序算法. 首先出场的是我们的主人公小哼,上面这个可爱的娃就是啦.期末考试完了老师要将同学们的分数按照从高到低排序.小哼的班上只有5个同学,这5个同学分别考了5分.3分.5分.2分和8分,哎,考得真是惨不忍睹(满分是10分).接下来将分

C言语合并排序(兼并排序)算法及代码

合并排序也称兼并排序,其算法思惟是将待排序序列分为两局部,顺次对分得的两个局部再次运用合并排序,之后再对其停止兼并.仅从算法思惟上理解合并排序会认为很笼统,接下来就以对序列A[0], A[l]-, A[n-1]停止升序陈列来停止解说,在此采取自顶向下的完成办法,操作步调如下.(1)将所要停止的排序序列分为阁下两个局部,假如要停止排序的序列的肇端元素下标为first,最初一个元素的下标为last,那么阁下两局部之间的临界点下标mid=(first+last)/2,这两局部辨别是A[first -

ArcGIS10.1 属性值排序,图斑排序

ArcGIS10.1技术交流(第4期) 属性值排序,图斑排序 第一讲 介绍了arcgis10.1中的排序这一个工具,介绍了如何利用这一个工具对属性值进行排序,以及对图斑块进行一个空间排序,以及途中还介绍了一下目前网上一种比较普通方法来进行图斑排序的一个原理,再次粗略的引了一下皮亚诺曲线 点击学习 第二讲 为上一讲讲到的ArcGIs自带的排序工具的下承接(),介绍从提取图斑外接矩形的左上点坐标,导出至Excel,对得到的坐标值进行两个排序,得到一个排序值,但是重点呢,不是结果,而是告诉大家这种方法

C语言中的排序算法--冒泡排序,选择排序,希尔排序

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端 维基百科:点击打开链接 [cpp] view plain copy /* 用选择法对10个数进行排序 */ #include<stdio.h> void main() { int i,j,