拓扑排序板子练习

news2024/11/18 16:22:59

目录

一、前言

二、拓扑排序板子

三、题目:拓扑顺序

1、上链接

2、基本思路

3、代码

(1)C++(AC)

(2)python(AC)

四、题目:可达性统计

1、上链接

2、基本思路

3、代码

(1)C++(AC)

(2)python


一、前言

拓扑排序想必不用再多介绍了,下面来看看拓扑排序的一个板子(遍历某一个点的所有边),并做两道拓扑排序相关的例题。

二、拓扑排序板子

直接看代码。

#include<iostream>
#include<queue>   // 拓扑排序经常需要用到队列 
#include<cstring>
using namespace std;

const int N=10010;
int n,m; //顶点数,边数 
int e[N],h[N],ne[N],idx;  //某边终点、以某点为起点的第一条边、以某点为起点的下一条边、第idx条边 
int degree[N];  //存储对应点的入度 

void Add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

void topsort(){
	queue<int> q;
	for(int i=1;i<=n;++i)
		if(!degree[i])
			q.push(i);
									
	while(!q.empty()){
		int t=q.front();
		q.pop();
		cout<<t<<" ";
		
		for(int i=h[t];~i;i=ne[i]){
			int j=e[i];
			if(--degree[j]==0)
				q.push(j);
		}
	}
	cout<<endl;
}

int main(){
	
	cin>>n>>m;
	
	memset(h,-1,sizeof h);  //所以~i能结束
	
	for(int i=0;i<m;++i){
		int a,b;
		cin>>a>>b;
		Add(a,b);  //把当前的边存起来 
		degree[b]++;
	}
	
	topsort();
	
	return 0;
	
}
 

三、题目:拓扑顺序

1、上链接

1639. 拓扑顺序 - AcWing题库

2、基本思路

对拓扑排序的板子进行相应的修改即可。

3、代码

(1)C++(AC)

#include<iostream>
#include<queue>   // 拓扑排序经常需要用到队列 
#include<cstring>
using namespace std;

const int N=10010;
const int K=110;
int n,m,k; //顶点数,边数 
int e[N],h[N],ne[N],idx;  //某边终点、以某点为起点的第一条边、以某点为起点的下一条边、第idx条边 
int degree[N];  //存储对应点的入度 
int ask[N],flg[K],d[N];

void Add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

int topsort(){
	for(int i=1;i<=n;++i){
		if(d[ask[i]])
			return 0;
		
		for(int j=h[ask[i]];~j;j=ne[j]){
			d[e[j]]--;
		}
	}
	return 1;
}

int main(){
	
	cin>>n>>m;
	
	memset(h,-1,sizeof h);
	
	for(int i=0;i<m;++i){
		int a,b;
		cin>>a>>b;
		Add(a,b);  //把当前的边存起来 
		degree[b]++;
	}
	
	cin>>k;
	
	for(int i=0;i<k;i++){
		for(int j=1;j<=n;j++){
			cin>>ask[j];
			d[ask[j]]=degree[ask[j]];
			//或这样写,都是一样的  
			// d[j] = degree[j]
		}
		if(topsort())
			flg[i]=1;
		else
			flg[i]=0;
	}
	
	int i=0;
	for(i=0;i<k;i++){
		if(!flg[i]){
			cout<<i;
			break;
		}
	} 
	
	i++;
	for(;i<k;++i){
		if(!flg[i])
			cout<<" "<<i;
	}
	cout<<endl;
	
	return 0;	
}
 

(2)python(AC)

N=10010

e=[0]*N
ne=[0]*N
h=[-1]*N
idx=0

degree=[0]*N
d=[0]*N
ask=[0]*N
flg=[0]*110

def Add(a,b):
    global idx
    e[idx]=b
    ne[idx]=h[a]
    h[a]=idx
    idx=idx+1

def topsort():
    for i in range(1,n+1):
        if d[ask[i]]!=0:
            return 0
        j=h[ask[i]]
        while ~j:
            d[e[j]]-=1
            j=ne[j]
    return 1


n,m=map(int,input().split())

for i in range(m):
    a,b=map(int,input().split())
    Add(a,b)
    degree[b]+=1

k=int(input())

for i in range(k):
    lines=list(map(int,input().split()))
    for j in range(1,n+1):
        ask[j]=lines[j-1]
        d[ask[j]]=degree[ask[j]]
    if topsort():
        flg[i]=1
    else:
        flg[i]=0
##    print(flg[i],end="@")
##    print("")
        

c=0
for i in range(k):
    if c==0 and flg[i]==0:
        print(i,end="")
        c=1
    elif flg[i]==0:
        print(" {}".format(i),end="")
print("")


四、题目:可达性统计

1、上链接

164. 可达性统计 - AcWing题库

2、基本思路

对拓扑排序的板子进行相应的修改即可。

3、代码

(1)C++(AC)

#include<iostream>
#include<cstring>
#include<queue>
#include<bitset>
using namespace std;

const int N=30010;
int n,m;
int e[N],ne[N],h[N],idx;
int degree[N];
int seq[N];

bitset<N> f[N];

void Add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

void topsort(){
	queue<int> q;
	for(int i=1;i<=n;++i)
		if(degree[i]==0)
			q.push(i);
			
	int k=0;
	while(!q.empty()){
		int t=q.front();
		q.pop();
		
		seq[k++]=t;
		for(int i=h[t];~i;i=ne[i]){
			int j=e[i];
			if(--degree[j]==0)
				q.push(j);
		}
	}
}

int main(){
	cin>>n>>m;
	memset(h,-1,sizeof h);
	for(int i=0;i<m;i++){
		int a,b;
		cin>>a>>b;
		Add(a,b);
		degree[b]++;
	}
	
	topsort();
	
	for(int i=n-1;i>=0;i--){
		int j=seq[i];
		f[j][j]=1;
		for(int p=h[j];~p;p=ne[p]){
			f[j]|=f[e[p]];
		}
	}
	
	for(int i=1;i<=n;++i){
		cout<<f[i].count()<<endl;
	}
	
	return 0;
} 

bitset用来处理二进制位非常方便。头文件是 #include<bitset>,bitset可能在PAT、蓝桥OJ中不常用,但是在LeetCode OJ中经常用到~而且知道 bitset 能简化一些操作,可能一些复杂的问题能够直接用 bitset 就很轻易的解决了。

bitset的用法随便百度一下就能找到一大堆,这里就不啰嗦了。

解释一下为什么“ f[j] |= f[e[p]] ”,如下图。(所以序列的遍历方向从后往前)

(2)python

我也想写一个python代码,在python中,bitset也确实可以写成一个类来实现,但是这个“类bitset”并不能起到优化空间的作用,该到题的内存会爆。而直接开一个二维列表来处理每个点的可达点数,内存无疑也会爆掉,故python代码我没能写出来。

稍微算一下题目的空间:

N和M的最大数值为 30000,即数组最大初始化有 30000 个int。

开 N^2 大小的空间,就有 9*10^8 个int,我们知道 10^6 个int约等于 4M,则 9*10^8 个int会有 3600M,题目空间限制为 256M。非常遗憾,内存爆了。

稍微解释一下 “10^6 个int约等于 4M”:

4M = 1024*4kb = 1024*1024*4byte = 10^6 个int

以上,拓扑排序

祝好

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++线程创建的方式和使用

进程与线程 进程 简单的可以认为是一个程序执行的过程。进程就是活跃的程序&#xff0c;在内存中运行&#xff0c;占用系统的资源。线程 线程也叫轻量级进程&#xff0c;通常一个进程包含若干个线程。线程可以利用进程所拥有的资源。在引入线程的操作系统中&#xff0c;通常都…

关于软件文档写作

关于软件文档写作目录概述需求&#xff1a;设计思路实现思路分析1.业务逻辑2.代码表达3.形式归纳4.方式和工具参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better resul…

JS模块化—CJSAMDCMDES6-前端面试知识点查漏补缺

本文从以时间为轴从以下几个方面进行总结JS模块化。从无模块化 > IIFE > CJS > AMD > CMD > ES6 > webpack这几个阶段进行分析。 历史 幼年期&#xff1a;无模块化 方式 需要在页面中加载不同的js&#xff0c;用于动画&#xff0c;组件&#xff0c;格式化…

【软件测试】一个边界值事故,领导leader心里苦季度奖金没了还被罚3K......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 项目组长&#xff1…

java类的练习--下面给出一个根据雇员类型利用多态性完成

java类的练习–下面给出一个根据雇员类型利用多态性完成… 题目 ​ 下面给出一个根据雇员类型利用多态性完成工资单计算的程序。定义一个类Employee作为超类&#xff0c;Employee的子类有Boss&#xff08;每星期发给他固定工资&#xff0c;而不计工作时间&#xff09;、Piece…

顶级“Redis学习笔记”,缓存雪崩+击穿+穿透+集群+分布式锁,NB了

如果你是一位后端工程师&#xff0c;面试时八成会被问到 Redis&#xff0c;特别是那些大型互联网公司&#xff0c;不仅要求面试者能简单使用 Redis&#xff0c;还要深入理解其底层实现原理&#xff0c;具备解决常见问题的能力。可以说&#xff0c;熟练使用 Redis 就是后端工程师…

超140支爆款B站恰饭,2022年B站双11战报来了!

- 导语 从0到3.06亿月活&#xff0c;从“与世无争”到今天手持高粘性、高活跃的用户参战双十一&#xff0c;在B站的品牌们有了更成熟的营销模式。 2022年双十一已经落下帷幕&#xff0c;在B站全面拥抱双十一的火热氛围下&#xff0c;有哪些品牌做到了声量、销量双丰收&#x…

【毕业设计】深度学习人脸表情识别系统 - python

文章目录0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码4 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f5…

基于 BERT 实现的情感分析(文本分类)----概念与应用

文章目录基于 BERT 的情感分析(文本分类)基本概念理解简便的编码方式: One-Hot 编码突破: Word2Vec编码方式新的开始: Attention 与 Transformer 模型四方来降: 超一流预处理模型 BERT 诞生BERT 实现情感分析数据预处理并创建数据集定义网络模型定义训练函数与评估函数设置损失…

AVL树的插入(C++实现)

1. 概念 AVL树&#xff08;Adelson-Velsky and Landis Tree&#xff09;于1962年被提出&#xff0c;是计算机科学中最早被发明的平衡二叉查找树。AVL树得名于它的发明者G. M. Adelson-Velsky和Evgenii Landis。 在AVL树中&#xff0c;任一节点对应的两棵子树的最大高度差为1&…

大一新生HTML期末作业 个人网页王嘉尔明星介绍网页设计与制作

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

领悟《信号与系统》之 信号与系统的描述-上节

信号与系统的描述-上节一、信号分类1. 一维信号和多维信号2. 确定信号和随机信号3. 连续时间信号和离散时间信号4. 周期信号和非周期信号5. 能量信号和功率信号二、常见工程信号1. 正弦信号2. 指数信号3. 取样信号4. 单位矩形脉冲信号5. 符号函数在真实的物理世界中&#xff0c…

Redis的优惠券秒杀问题(五)全局唯一ID 以及 秒杀下单

Redis的优惠券秒杀问题&#xff08;五&#xff09;全局唯一ID 以及 秒杀下单 关于优惠秒杀问题的Redis实现章节总览 全局唯一ID 场景分析 不能用自增的原因 id的规律性太明显 受单表数据量的限制 全局唯一ID的条件 全局唯一ID的Redis实现 代码实现 单元测试 其它…

【FPGA】FPGA实现SPI协议读写FLASH(一)----- M25P16操作概述

文章目录一、FLASH介绍&#xff08;M25P16&#xff09;1、M25P16概述2、SPI模式3、存储结构4、指令集5、时间参数二、M25P16工作原理三、M25P16指令操作1、页编程 (PP)2、扇区擦除和整块擦除 (SE and BE)3、写使能 (WREN)4、读ID&#xff08;RDID&#xff09;5、读状态寄存器&a…

使用c#将aj-report桌面化:1.winform嵌入浏览器

说到底,aj-report是个工具,我想大多数人还是想快速使用它来创建一个可以展示的工具。通过之前的章节,你应该可以制作自己的报表页面了,下面我们来看看怎么把aj-report包装成一个桌面能够运行的软件。 当然作为扩展开发,受开源协议限制,我们不能大规模修改aj-report的源代…

【毕业设计】深度学习图像修复算法研究与实现 - python

文章目录1 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像4 在Tensorflow上构建DCGANs5 最后1 前言 &#x1…

PC_OS中断/中断屏蔽字

文章目录程序中断&#x1f383;中断概念中断功能(作用)中断请求中断源中断分类外中断非屏蔽中断和可屏蔽中断陷入(内中断)硬件中断和软件中断关系整理&#x1f388;中断判优&#x1f388;中断优先级CPU响应中断的条件外中断实现思路&#x1f388;中断隐指令 及其工作①关中断②…

下一个倒下的是不是Genesis

今日&#xff0c;一个关于“Genesis今晚破产”的传言在各个社交平台传播&#xff0c;包括行业的KOL也在讨论这个事情&#xff0c;认为Genesis或存在偿付能力问题&#xff0c;该公司将于美国东部时间11月17日8&#xff1a;00am与债权人通话以解释情况。若消息属实&#xff0c;Ge…

【AGC】flutter之agconnect_crash在ios上崩溃

问题背景 flutter agconnect_crash-1.2.0300 运行在ios平台上&#xff0c;出现了如下这个崩溃 NSInvalidArgumentException: *** [NSJSONSerialization dataWithJSONObject:options:error:]: value parameter is nil 0 CoreFoundation 0x00000001830d005c 0x183037000 62678…

视频讲解vue2基础之渲染v-if/v-show/v-for/v-html

大家好&#xff0c;我是你们的老朋友lqj_本人&#xff0c;最近一周没有更新文章了&#xff0c;是因为最近学校有一些活动比赛&#xff0c;也有一部分原因就是我在录制一些关于前端方面的视频&#xff0c;涉及到的领域主要一前端&#xff0c;比如&#xff1a;H5开发&#xff0c;…