首页 > 其他分享 >拓扑排序

拓扑排序

时间:2023-01-27 11:11:07浏览次数:38  
标签:include int inDegree 拓扑 stk 排序 adj

拓扑排序是一种图论算法,它用于对有向无环图(DAG)进行排序。该算法的目的是找到图中所有顶点的线性排列,使得对于图中的任意两个顶点 u 和 v,如果存在一条从 u 到 v 的边,那么在排列中 v 出现在 u 的后面。

拓扑排序的解决思路为

1.从 DAG 图中选择一个 没有前驱(即入度为0)的顶点并输出

2.从图中删除该顶点和所有以它为起点的有向边

3.重复 1 和 2 直到当前的 DAG 图为空或当前图中不存在无前驱的顶点为止。后一种情况说明有向图中必然存在环。

 

 

 

 

 

 得到的拓扑顺序为{1,2,4,3,5}

描述

给定一个包含nn个点mm条边的有向无环图,求出该图的拓扑序。若图的拓扑序不唯一,输出任意合法的拓扑序即可。若该图不能拓扑排序,输出-1−1。

输入描述:

第一行输入两个整数n,m,表示点的个数和边的条数。
接下来的m行,每行输入两个整数ui,vi,表示ui​到vi​之间有一条有向边。

输出描述:

若图存在拓扑序,输出一行n个整数,表示拓扑序。否则输出-1。
#include <iostream>
#include<stdio.h>
#include<list>
#include <vector>
#include <queue>
using namespace std;

vector<list<int>> adj;
vector<int> inDegree;
queue<int> stk;
int n;
int m;
void CreateGraph()
{    
    cin >> n >> m;
    adj.assign(n+1,list<int>());
    inDegree.assign(n+1,0);
    int in,out;
    while (m--)
    {
        cin >> in >> out;
        adj[in].push_back(out);
        inDegree[out]++;
    }
    for(int i = 1;i <= n;i++)
    {
        if (0 == inDegree[i])
        {
            stk.push(i);
        }
    }
}

void TopSort()
{
    vector<int> res;
    int v;
    while (!stk.empty())
    {
        v = stk.front();
        stk.pop();
        //
        for(auto it = adj[v].begin();it != adj[v].end();it++)
        {
            inDegree[*it]--;
            if (inDegree[*it] == 0)
            {
                stk.push(*it);
            }
            
        }
        res.push_back(v);
        if (res.size() == (inDegree.size() - 1))
        {
            break;
        }
    }
    if (res.size() != (inDegree.size()-1))
    {
        cout << "-1" << endl;
        return ;
    }
    for(int i = 0;i < res.size();i++)
    {
        cout << res[i];
        if (i != res.size() - 1)
        {
            cout << " ";
        }
    }
}
int main() {
    CreateGraph();
    TopSort();
    return 0;
}

 

标签:include,int,inDegree,拓扑,stk,排序,adj
From: https://www.cnblogs.com/polang19/p/17068659.html

相关文章

  • MySQL基础篇(运算符、排序分页、多表查询、函数)
    MySQL基础篇​​数据库概述​​​​数据库与数据库管理系统​​​​数据库与数据库管理系统的关系​​​​Mysql介绍​​​​RDBMS与非RDBMS​​​​关系型数据库(RDBMS)......
  • 83. 删除排序链表中的重复元素
    题目描述给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。方法1双指针方式描述指针p去找寻是否为相同的节点如果......
  • 前端小技巧之 --- 【对象数组分类并排序】
    当前需求是:把下面的数组,按照index值分类,再按照字母顺序排序exportconstsingerList=[{id:0,index:'Z',name:'周杰伦'},{id:1,index:'X',......
  • 排序
    快速排序#include<iostream>usingnamespacestd;intnums[100];voidquicksort(intnum[],intleft,intright){if(left>=right)return;inttarge......
  • 经典问题 1 —— DAG 上区间限制拓扑序
    问题描述给定一个DAG,求一个拓扑序,使得节点\(i\)的拓扑序\(\in[l_i,r_i]\)。题解首先进行一个预处理:对于所有\(u\),令\(\forall(v,u)\inE,l_u\leftarrow\max(l......
  • 快速排序和归并排序
    快速排序:  归并排序:  注意分成两个区间时的+1和-1是写在哪里的。......
  • 如何在 MySQL 中对选择查询获得的结果进行排序?
    通常从表中选择某些数据或行。行按它们在表中出现的顺序返回。我们有时可能会要求从表中选择的行必须相对于某些列按升序或降序返回给我们。“ORDERBY”语句用于对某些列的......
  • 编写一个 Python 代码以按第 n 列对 NumPy 中的数组进行排序?
    在本文中,我们将向您展示如何在python中按升序和降序按第n列对NumPy中的数组进行排序。NumPy是一个Python库,旨在有效地处理Python中的数组。它快速、简单易学且存储高......
  • 【转】c++中Vector等STL容器的自定义排序
    三种方式实现vector的自定义排序方法1:重载运算符#include<vector>#include<algorithm>#include<functional>usingnamespacestd;structTItem{intm_i......
  • JavaScript 排序算法
    JavaScript提供了Array.prototype.sort()方法来对数组中的元素进行排序。默认情况下,sort()方法使用字典序来排序字符串。如果要按照数字大小进行排序,需要传递一个比较......