首页 > 编程语言 >拓扑排序算法笔记

拓扑排序算法笔记

时间:2023-08-17 09:02:17浏览次数:69  
标签:int 拓扑 back fat 算法 100001 排序

思想

拓扑,一看就是从图的开始开始开拓,并按被开拓到的顺序排序

拓扑排序的思想如下:

将入度为 \(0\) 的点删除,并记录它被删除的顺序,直到没有点则结束程序

代码也十分简单:

#include<bits/stdc++.h>
using namespace std;
bool b[100001];
int fat[100001];
vector<int>v[100001];
int main(){
	int n,m=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		v[x].push_back(y);
		fat[y]++;//记录入度
	}
	queue<int>q;
	for(int i=1;i<=n;i++){
		if(fat[i]==0){//将入度为0的点入队
			q.push(i);
			b[i]=1;
		}
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=0;i<v[u].size();i++){
			int nn=v[u][i];
			fat[nn]--;//入度减少
			if(fat[nn]==0){
				q.push(nn);//将入度为0的点入队
				b[nn]=1;
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(!b[i])cout<<i<<" ";	//也可以判断环上的点
	}
	return 0;
}

例题

P8655 [蓝桥杯 2017 国 B] 发现环

点击查看代码
#include<bits/stdc++.h>
using namespace std;
bool b[100001];
int fat[100001];
vector<int>v[100001];
int main(){
	int n,m=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		int x,y;
		cin>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
		fat[x]++;
		fat[y]++;
	}
	queue<int>q;
	for(int i=1;i<=n;i++){
		if(fat[i]==1){
			q.push(i);
			b[i]=1;
		}
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=0;i<v[u].size();i++){
			int nn=v[u][i];
			fat[nn]--;
			if(fat[nn]==1){
				q.push(nn);
				b[nn]=1;
			}
		}
	}
	for(int i=1;i<=n;i++){
		if(!b[i])cout<<i<<" ";	
	}
	return 0;
}

B3644 【模板】拓扑排序 / 家谱树

标签:int,拓扑,back,fat,算法,100001,排序
From: https://www.cnblogs.com/ccr-note/p/topusort.html

相关文章

  • 8016: 重新排序 差分
    描述 给定一个数组 A 和一些查询 Li,Ri,求数组中第 Li 至第 Ri 个元素之和。小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查询结果的和尽可能地大。小蓝想知道相比原数组,所有查询结果的总和最多可以增加多少?  输入 输入第一行包含一个整数......
  • 4877: 火柴排队 归并排序
    描述  涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:Σ(ai-bi)^2,i=1~n,其中ai表示第一列火柴中第i个火柴的高度,bi表示第二列火柴中第i个火柴的高度。每列火柴中相邻两根火柴的......
  • KMP 算法
    KMP算法一个人能走的多远不在于他在顺境时能走的多快,而在于他在逆境时多久能找到曾经的自己。——KMP例题【模板】KMP字符串匹配原理朴素算法的缺陷设主串与模式串的长度分别为\(m\),\(n\),那么完成一次匹配的最坏时间复杂度将是\(O(mn)\)。匹配算法的改进我们思......
  • 强连通分量与tarjan算法
    强连通分量强连通:若一张有向图的节点两两之间可以互相抵达,那么这一张图是强连通的。强连通分量:极大的强连通子图。对图深度搜索的时候,每一个节点只访问一次,被访问过的节点与边构成搜索树。有向边按照访问的情况可以分为如下4类:1.树边:访问节点走过的边。2.返祖边:指向祖......
  • Python 实现排序算法
    常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。冒泡排序冒泡排序(BubbleSort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复......
  • 4866: 瑞士轮 归并排序
    描述  2*N名编号为1~2N的选手共进行R轮比赛。每轮比赛开始前,以及所有比赛结束后,都会按照总分从高到低对选手进行一次排名。选手的总分为第一轮开始前的初始分数加上已参加过的所有比赛的得分和。总分相同的,约定编号较小的选手排名靠前。每轮比赛的对阵安排与该轮比赛开始前......
  • 5708: 逆序对 归并排序
    描述  给定 一个序列,求其逆序对的总数。所谓逆序对是指:序列a中存在两个元素a[i]和a[j],满足 i<j 且a[i]>a[j],则a[i]和a[j]为一个逆序对。  输入  第一行为正整数n(n<=100000)。第二行有n个正整数,最大不超过1000000。  输出  输出逆序对的总数。......
  • Matlab蛇群算法(SO)优化双向长短期记忆神经网络的数据分类预测,SO-BiLSTM分类预测,多输
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 路径规划算法:基于减法平均优化的机器人路径规划算法- 附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 路径规划算法:基于袋獾优化的机器人路径规划算法- 附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......