首页 > 其他分享 >DFS实现拓扑排序

DFS实现拓扑排序

时间:2024-08-07 12:27:34浏览次数:12  
标签:int 拓扑 入度 dfs vis maxn DFS 排序 节点

对应题目:B3644 【模板】拓扑排序 / 家谱树

实现思路:

  • ind[i] 记录当前节点 \(i\) 的入度;
  • vis[i] 打标记 —— 记录节点 \(i\) 是否已经输出。

然后从 \(1 \rightarrow n\) 枚举节点 \(i\),如果节点 \(i\) 未标记并且此时节点 \(i\) 的入度为 \(0\),则 dfs(i)

dfs(u) 的过程中,首先对 \(u\) 进行标记,其次输出 \(u\),然后:对于节点 \(u\) 连接的每个节点 \(v\),令 \(v\) 的入度减小 \(1\)(因为删除了 \(u \rightarrow v\) 的这条边)后,若节点 \(v\) 的入度为 \(0\),则继续对节点 \(v\) 调用 dfs(v)

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
vector<int> g[maxn];
int n, ind[maxn];
bool vis[maxn];

void dfs(int u) {
	vis[u] = true;
	cout << u << " ";
	for (auto v : g[u])
		if (--ind[v] == 0)
			dfs(v);
}

int main() {
	cin >> n;
	for (int u = 1; u <= n; u++) {
		int v;
		while (cin >> v && v) {
			g[u].push_back(v);
			ind[v]++;
		}
	}
	for (int i = 1; i <= n; i++)
		if (!ind[i] && !vis[i])
			dfs(i);
	return 0;
}

标签:int,拓扑,入度,dfs,vis,maxn,DFS,排序,节点
From: https://www.cnblogs.com/quanjun/p/18346813

相关文章

  • 排序算法
    排序算法BUBSort冒泡排序伪代码do-swapped=false-fromi=1to最后一个没有排序过元素的索引-1-ifleft>right--swap(left,right)--swapped=truewhileswapped代码实现voidBubSort(){inttem=0;boolswapped;do{t......
  • 代码随想录算法训练营第61天 | 图论part08:拓扑排序+迪杰斯特拉朴素法
    117.软件构建https://kamacoder.com/problempage.php?pid=1191拓扑排序精讲https://www.programmercarl.com/kamacoder/0117.软件构建.html#拓扑排序的背景47.参加科学大会https://kamacoder.com/problempage.php?pid=1047dijkstra(朴素版)精讲https://www.programmercarl.c......
  • 排序算法优化思考
    引言排序算法是人们研究的最多的一类计算机算法,也是计算机中最基础、使用频率最高的一类算法。虽然对排序算法的理论研究在目前看来被认为已经是最优解,但面对工业界各类问题,人们还是持续提出了针对特定场景的“更优”的算法。通过对排序算法的研究和优化,我们可以清晰的感受......
  • 排序算法 归并排序 MergeSort -- C语言实现
    归并排序归并排序(Mergesort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(DivideandConquer)的一个非常典型的应用。作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法);自下......
  • 排序算法 希尔排序 ShellSort -- C语言实现
    希尔排序希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;但插入排序一般来说是低效的,因为插入排......
  • 排序算法 快速排序 quickSort -- C语言实现
    快速排序快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(nlogn)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(nlogn)算法更快,因为它的内部循环(innerloop)可以在大部分的架构上很有效率地被实......
  • 排序算法 堆排序 HeapSort -- C语言实现
    堆排序堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:大顶堆:每个节点的值都大于或等于其子......
  • 利用指针来升序数组,(冒泡排序)
    我们写完数组后,通过写函数来是代码清晰明了,第一个升序函数,通过传入arr与len,再用冒泡排序的方法即可将数组升序,这里注意,传入arr,也就是数组的首地址,函数用Int*arr接受,这里传入首地址,也就是指针的方法,这个首地址(指针)允许函数内部通过数组索引的方法来访问数组中的其他元素,......
  • 排序算法 选择排序 SelectSort -- C语言实现
    选择排序描述选择排序是一种简单直观的排序算法,无论什么数据进去都是O(n²)的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了。算法步骤首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。再从剩余未排序元素中继续寻......
  • 排序算法 冒泡排序 BubbleSort -- C语言实现
    冒泡排序描述冒泡排序(BubbleSort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢......