acwing算法基础之搜索与图论--有向图的拓扑序列

目录

  • [1 基础知识](#1 基础知识)
  • [2 模板](#2 模板)
  • [3 工程化](#3 工程化)

1 基础知识

拓扑序列:针对有向图而言,该序列内,所有边都是从前指向后的。

如果存在环,那么该图一定不存在拓扑序列。否则,一定存在拓扑序列。

有向图中的入度和出度。

入度为0的结点,可以作为拓扑序列的起点。

求拓扑序列的关键步骤:

  1. 把入度为0的结点插入队列q。
  2. 弹出队头t,遍历队头t的下一个结点,将其入度减1。操作之后,如果其值为0,则插入队列q。
  3. 重复进行步骤2,直至队列q为空。

2 模板

题目1:给出结点数目n和边数m,以及一系列的边,如果此图存在拓扑序列,请输出(输出任意一种拓扑序列即可);否则,输出-1。

cpp 复制代码
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

const int N = 1e5 + 10;
int n, m;
vector<vector<int>> g(N);
vector<int> d(N); //存储每个结点的入度

int main() {
    cin >> n >> m;
    int x, y;
    while (m--) {
        cin >> x >> y;
        //添加x到y的边
        g[x].emplace_back(y);
        d[y]++;
    }
    
    queue<int> q;
    for (int i = 1; i <= n; ++i) {
        if (d[i] == 0) {
            q.push(i);
        }
    }
    
    vector<int> res;
    while (!q.empty()) {
        auto t = q.front();
        res.emplace_back(t); //存入向量res中 
        q.pop();
        
        //t可以走到哪里
        for (auto x : g[t]) {
            //把结点t删除
            d[x]--;
            if (d[x] == 0) {
                q.push(x);
            }
        }
    }
    
    if (res.size() == n) {
        for (int i = 0; i < n; ++i) cout << res[i] << ' ';
        cout << endl;
    } else {
        puts("-1");
    }
    
    return 0;
}

3 工程化

暂无。。。

相关推荐
爱写Bug的浮游10 分钟前
unique_ptr 零开销的真相与边界
c++·facebook
xiaoye-duck32 分钟前
《C++ 项目:手写大模型接入 SDK》ChatGPT接口设计(下):流式响应实现和测试
网络·c++·语言模型·chatgpt
微尘hjx37 分钟前
【Deep-OC-SORT 02】多轨迹算法Deep-OC-SORT-相对 OC-SORT 的改进点
人工智能·算法·yolo·目标跟踪·视觉检测·ultralytics·deep-oc-sort
梦帮科技38 分钟前
意识启发式量子隧穿退火算法用于全局优化 (CITA) 完整技术指南
网络·人工智能·算法·量子计算·模拟退火算法
一去不复返的通信er2 小时前
排序 + 双指针:力扣15三数之和
算法·leetcode
落樱弥城2 小时前
Perf 逐步探查性能缺口并优化
c++·性能优化
Pniubi2 小时前
力扣3无重复字符的最长字串(滑动窗口)
算法·leetcode·职场和发展
坤坤子吖2 小时前
Linux网络编程:UDP进阶,从字典服务器到简单聊天室
linux·服务器·网络·c++·笔记·学习
On The Road :2 小时前
深入理解 JVM 垃圾回收:GC 是什么、如何判定垃圾、四大回收算法全解析
jvm·算法
Rabitebla2 小时前
【Linux学习笔记】进程篇(九):进程的创建与退出——fork、写时拷贝与退出码
linux·c++·笔记·学习