首页 > 其他分享 >拓扑排序_学习记录

拓扑排序_学习记录

时间:2024-01-17 18:46:35浏览次数:26  
标签:所有 记录 拓扑 入度 BFS 排序

拓扑排序_学习记录

第一次在读入数据时被TLE……

What is 拓扑排序?

拓扑排序——Topological sorting(所以说写函数名时用ts 而不是 tp),拓扑排序要解决的问题是给一个有向无环图的所有节点排序。

顾名思义,就是可以把一个有向的无环的图中所有的点按照一定规则排序的算法……

emmm,还是不理解的话,看一眼下面的图吧
image
出自https://blog.csdn.net/z13192905903/article/details/103496819
这张图是按每个点的入度来排序的

也就是说,当我们读入一个图时,要先统计一下每个点的入度,然后每次取入度为0的点扔到队列中去,然后把从这个点出发的所有边删去——也就是把到达的所有节点的入度全部减1。一直循环,直到没有入度大于0的点为止。

当然,也可以用出度来排序,依据实际情况而定。

现阶段实现拓扑排序的方式为BFS。如果要输出所有拓扑排序的情况,那就用DFS。

下面是BFS实现代码:板子:家谱树。

#include<bits/stdc++.h>
using namespace std;
#define s(n) scanf("%d", &n)
int n, node[101], x; //node数组记录入度 
queue<int> q;
vector<int> G[101]; //这里用邻接表存边(感觉比向前星方便) 
inline void tsfind(){
	for(int i=1; i<=n; i++){
		if(node[i] == 0){ //找到入度为0的点 
			q.push(i); //扔进队列 
			--node[i]; //可要可不要 
		}
	}
	while(!q.empty()){
		int k = q.front(); q.pop();
		printf("%d ", k);
		for(int i=0; i<G[k].size(); i++){
			if(--node[G[k][i]] == 0){ //找到入度为0的点 
				q.push(G[k][i]); //扔进队列 
				--node[G[k][i]]; //可要可不要 
			}
		}
	}
}
int main(){
	s(n);
	for(int i=1; i<=n; i++){ //读入 
		while(s(x) && x){
			node[x]++;
			G[i].push_back(x);
		}
	}
	tsfind();
	return 0;
}

标签:所有,记录,拓扑,入度,BFS,排序
From: https://www.cnblogs.com/xiaolemc/p/17970723

相关文章

  • 记录--为什么 export 导出一个字面量会报错,而使用 export default 就不会报错?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助核心其实总的来说就是export导出的是变量的句柄(或者说符号绑定、近似于C语言里面的指针,C++里面的变量别名),而exportdefault导出的是变量的值。需要注意的是:模块里面的内容只能在模块内部修改,模块外部只能使......
  • 基础算法(二)归并排序模板
    模板如下#include<iostream>usingnamespacestd;constintN=1000010;intq[N],tmp[N];voidmerge_sort(intq[],intl,intr){if(l>=r)return;intmid=(l+r)>>1;intk=0,i=l,j=mid+1;merge_sort(q,l,mid);merge_sort(q,......
  • 记录eletron客户端win7打包及安装使用问题
    win7nodeV14环境配置不能使用msi包安装nodeV14.x,需要下载zip包,手动解压安装文件。下载,nodeV14.15.3下载地址下载完成后解压,并配置环境变量系统变量新增 NODE_PATH 为 C:\nodepath-xx\node_modules系统变量新增 NODE_SKIP_PLATFORM_CHECK 为 1系统变量 path 追加 ;C:\node......
  • 常见错误记录之连接MySQL8.0(Navicate Premium 12,出现BigInteger错误)
    一、NavicatePremium12连接MySQL8.0包如下错误: 出错原因:mysql8之前的版本中加密规则为mysql_native_passwordmysql8以后的加密规则为caching_sha2_password解决方法:(1)更新navicat驱动来解决此问题(2)将mysql用户登录的加密规则常用第二种方法:1.用管理员权限打开cmd,输入mysql......
  • MyBatis学习记录之MyBatis入门程序
    MyBatis学习记录之MyBatis入门程序前言这篇文章是我第二次学习b站老杜的MyBatis相关课程所进行的学习记录,算是对课程内容及笔记的二次整理,以自己的理解方式进行二次记录,其中理解可能存在错误,欢迎且接受各位大佬们的批评指正;关于本笔记,只是我对于相关知识遗忘时快速查阅了解使......
  • 记录一次SQLServer复制监控器(replication monitor)复制延迟数值为NULL的异常处理
     现象在SQLServer复制(订阅发布),在正常运行的情况下,发布节点一直有写入,订阅节点也正常复制到了这些数据,但分发节点的复制监控器面板(replicationmonitor)无法看到部分发布对象的延迟信息。如下,经过重启SQLServer服务,重启SQLServerAgent服务,重启操作系统等尝试后,均无效,依旧显示不......
  • MyBatis学习记录之MyBatis概述
    MyBatis学习记录之MyBatis概述前言这篇文章是我第二次学习b站老杜的MyBatis相关课程所进行的学习记录,算是对课程内容及笔记的二次整理,以自己的理解方式进行二次记录,其中理解可能存在错误,欢迎且接受各位大佬们的批评指正;关于本笔记,只是我对于相关知识遗忘时快速查阅了解使用,至......
  • echarts记录篇(八):饼图记录
    (data)=>{console.log(data);varcategories=[];for(vari=0;i<data.length;i++){categories.push(data[i]['name'])}varname_color=[{name:"中国振华",color:"#5470c6"......
  • echarts记录篇(六):象形图记录
    (data)=>{console.log(data);varcategories1=[];varname=[];vardata1=[];vardata2=[];for(vari=0;i<data.length;i++){name.push(data[i]["pur_yr"]);}for(vari=0;i<da......
  • echarts记录篇(六):雷达图记录
    (data)=>{console.log(data);varcategories1=[];varcategories2=[];varname=[];vardata1=[];vardata2=[];for(vari=0;i<data.length;i++){if(name.indexOf......