拓扑排序(练习题)

news2024/11/15 4:34:19

文章目录

  • 拓扑排序
  • [P1113 杂务](https://www.luogu.com.cn/problem/P1113)
    • 题目描述
    • 输入格式
    • 输出格式
    • 代码(BFS)
  • [P4017 最大食物链计数](https://www.luogu.com.cn/problem/P4017)
    • 题目描述
    • 输入格式
    • 输出格式
    • 代码(BFS)
    • 代码(DFS)
  • [P1983 [NOIP2013 普及组] 车站分级](https://www.luogu.com.cn/problem/P1983)
    • 题目
    • 代码

拓扑排序

一个图能进行拓扑排序的充要条件是它是有向无环图(DAG)。有入度,出度的概念。BFS,DFS 都能实现。
** BFS **
分为无前驱和无后继的顶点优先。
无前驱
1.先找到入度为零的顶点,入队
2.弹出队首,将其邻居点入度-1,入度=0,入队
3.循环2,直到为空
无解说明不是DAG,未入队的是环路上的点。

P1113 杂务

题目描述

John 有需要完成的 n n n 个杂务的清单,并且这份清单是有一定顺序的,杂务 k   ( k > 1 ) k\ (k>1) k (k>1) 的准备工作只可能在杂务 1 1 1 k − 1 k-1 k1 中。(由于这个,此题不用拓扑也很简单)

写一个程序依次读入每个杂务的工作说明。计算出所有杂务都被完成的最短时间。当然互相没有关系的杂务可以同时工作,并且,你可以假定 John 的农场有足够多的工人来同时完成任意多项任务。

输入格式

第1行:一个整数 n   ( 3 ≤ n ≤ 10 , 000 ) n\ (3 \le n \le 10{,}000) n (3n10,000),必须完成的杂务的数目;

2 2 2 n + 1 n+1 n+1 行,每行有一些用空格隔开的整数,分别表示:

  • 工作序号(保证在输入文件中是从 1 1 1 n n n 有序递增的);
  • 完成工作所需要的时间 l e n   ( 1 ≤ l e n ≤ 100 ) len\ (1 \le len \le 100) len (1len100)
  • 一些必须完成的准备工作,总数不超过 100 100 100 个,由一个数字 0 0 0 结束。有些杂务没有需要准备的工作只描述一个单独的 0 0 0

保证整个输入文件中不会出现多余的空格。

输出格式

一个整数,表示完成所有杂务所需的最短时间。

代码(BFS)

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int ind[500005],f[500005],a[500005];
vector<int> e[500005];
queue<int> q;
signed main()
{
	IOS
	int n,b,c;

	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>b>>a[i];
		while(cin>>c&&c!=0)
		{
			e[c].push_back(i);//e存放出度编号
			ind[i]++;//ind计算入度个数
		}
	}
	for(int i=1;i<=n;i++)//找到入度为零的点存入队列
		if(ind[i]==0)
		{
			q.push(i);
			f[i]=a[i];//完成时间就是单个任务的完成时间
		}
	while(!q.empty())
	{
		int r=q.front();//推出的第一个
		q.pop();
		for(int i=0;i<e[r].size();i++)
		{
			int u=e[r][i];
			ind[u]--;//将r指向的编号入度-1
			if(ind[u]==0) q.push(u);
			f[u]=max(f[u],f[r]+a[u]); //最大的时间是某杂物的完成时间
		}
		
		
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	ans=max(ans,f[i]);
	cout<<ans<<'\n';
	return 0;
	
	 
}

P4017 最大食物链计数

题目描述

给你一个食物网,你要求出这个食物网中最大食物链的数量。
(这里的“最大食物链”,指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者。)
Delia 非常急,所以你只有 1 1 1 秒的时间。
由于这个结果可能过大,你只需要输出总数模上 80112002 80112002 80112002 的结果。

输入格式

第一行,两个正整数 n 、 m n、m nm,表示生物种类 n n n 和吃与被吃的关系数 m m m

接下来 m m m 行,每行两个正整数,表示被吃的生物A和吃A的生物B。

输出格式

一行一个整数,为最大食物链数量模上 80112002 80112002 80112002 的结果。

【补充说明】

数据中不会出现环,满足生物学的要求。(感谢 @AKEE )

代码(BFS)

累加,上一个点的答案累加到下一个点。初始为1,最后每一条路都会累加到出度为零的点,再加一块。所以用向量存出度,要到下一个点,接着算(而dfs,要存入度)

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int ind[500005],sum[500005];//ind放入度,sum累加食物链
const int mod=80112002;
//vector<int> ch[500005];
vector<vector<int>> ch;
queue<int> d;
signed main()
{
	IOS
	ch.resize(500005);
	int n,m,a,b,ans=0;
	cin>>n>>m;
 	for(int i=1;i<=m;i++)
 	{
	 	cin>>a>>b;
		ch[a].push_back(b);//a里存放他的天敌,即出度
		ind[b]++;
	 }
	 for(int i=1;i<=n;i++)
	 {
	 	if(ind[i]==0)//找到食物链底端
	 	{
		 	d.push(i);
		 	sum[i]++;
		 }
	 }
	 while(!d.empty())
	{
		int u=d.front();
		d.pop();
		for(int i=0;i<ch[u].size();i++)
		{
			ind[ch[u][i]]--;
			sum[ch[u][i]]=(sum[ch[u][i]]+sum[u])%mod;//加上它食物的链数
			if(ind[ch[u][i]]==0)
			{
				d.push(ch[u][i]);
			}
			
		}
	} 	
	for(int i=1;i<=n;i++)
	if(ch[i].size()==0)//没有天敌,即顶端加一块
	ans=(ans+sum[i])%mod;
	cout<<ans<<'\n';
	 
}

代码(DFS)

向量存入度结点,需要递归从后往前,最前端写1,在往后累次加

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
vector<vector<int> > ch;
const int mod=80112002;
int out[500005],sum[500005];//out计算出度,sum计算链数
int dfs(int j)
{
	if(ch[j].empty()) //到达食物链底端
	{
	sum[j]=1;
	return 1;
	}
	    for(int i=0;i<ch[j].size();i++)
	   {
		if(sum[ch[j][i]]==0)
		sum[j]=(sum[j]+dfs(ch[j][i]))%mod;
		else
		 sum[j]=(sum[j]+sum[ch[j][i]])%mod;//j点链数等于j点加上他的入度链数
    	}
	   
   	 return sum[j];
}
signed main()
{
   ch.resize(500005);
	int n,m,x,y,ans=0;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>x>>y;
		out[x]++;
		ch[y].push_back(x);
	}
	for(int i=1;i<=n;i++)
	{
		if(out[i]==0)//找到顶端
		ans=(ans+dfs(i))%mod;
	}
	cout<<ans;
	
}

P1983 [NOIP2013 普及组] 车站分级

题目

在这里插入图片描述

代码

每个火车,从始到终没停的站点,可以看作已停的入度。
入度为0的开始,level为1,往后累加。出度为0中最大的level为答案。这里用的out数组,开始用的vector,MLE,TLE,还有初始化问题。没成功。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
queue<int> q;
//vector<vector <int> > out;不能用
int out[1005][1005];
int n,m,ind[1005],a[1005],level[1005];
void bfstuopu()
{
	for(int i=1;i<=n;i++)
	if(ind[i]==0)
	{
		q.push(i);
		level[i]=1;
	}
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=1;i<=n;i++)
		{
			if(out[u][i]==1)
			{
				ind[i]--;
				if(ind[i]==0)
				{
					q.push(i);
					level[i]=level[u]+1;
				}
			}	
		}
	}
}
signed main()
{
	IOS
	int s;
	cin>>n>>m;
	int v[1002];
	for(int i=1;i<=m;i++)
	{
		
		memset(v,0,sizeof(v));
		cin>>s;
		for(int j=1;j<=s;j++)
		{
			cin>>a[j];
			v[a[j]]=1;
		}
	
		for(int j=a[1];j<=a[s];j++)
		if(v[j]==0)
		{
			for(int k=1;k<=s;k++)
			{
				if(out[j][a[k]]==0)
			//	if(find(out[j].begin(),out[j].end(),a[k])==out[j].end()) //加if  不会MLE,但TLE
				{
						out[j][a[k]]=1;
						ind[a[k]]++;
							 
				}	
			}
			
		}	 
	}
	bfstuopu();
	int ans=1;
	for(int i=1;i<=n;i++)
	ans=max(ans,level[i]);
 	cout<<ans;
 
}

二维vector初始化
vector<vector > vec(10,vector(8))
10行8列,全为0

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

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

相关文章

Python实战MySQL之数据库操作全流程详解

概要 MySQL是一种广泛使用的关系型数据库管理系统,Python可以通过多种方式与MySQL进行交互。本文将详细介绍如何使用Python操作MySQL数据库,包括安装必要的库、连接数据库、执行基本的CRUD(创建、读取、更新、删除)操作,并包含具体的示例代码,帮助全面掌握这一过程。 准…

基于天地图使用Leaflet.js进行WebGIS开发实战

目录 前言 一、天地图的key 1、创建应用 2、调用限制策略 注&#xff1a; &#xff08;1&#xff09;日服务调用超量会暂时拒绝访问&#xff0c;次日自动开启&#xff1b; &#xff08;2&#xff09;如果服务调用过程中存在数据爬取或者下载行为&#xff0c;服务调用会被自…

UE4-系统默认天空球的使用

当我们在调整平行光的时候&#xff0c;会发现场景中的光照改变了&#xff0c;但是太阳的位置并没有改变&#xff0c;此时就需要用到系统默认的天空球中的&#xff1a; 但是只有在选中是由平行光的改变而改变的情况下才会发生改变&#xff0c;如果没有选择或者选择其他的光源&am…

爬虫(一)——爬取快手无水印视频

前言 最近对爬虫比较感兴趣&#xff0c;于是浅浅学习了一些关于爬虫的知识。爬虫可以实现很多功能&#xff0c;非常有意思&#xff0c;在这里也分享给大家。由于爬虫能实现的功能太多&#xff0c;而且具体的实现方式也有所不同&#xff0c;所以这里开辟了一个新的系列——爬虫…

MySQL(6)内置函数,复合查询.

目录 1.内置函数; 2.复合查询; 1.内置函数: 1.1 日期函数: 时分秒: 时间戳: 基本日期上加日期: 基本日期减去日期: 日期相差天数: &#x1f330; 创建一张表&#xff0c;记录生日: 创建一个留言表: 显示所有留言信息&#xff0c;发布日期只显示日期&#xff0c;不用显示时间: …

【数据结构】Splay详解

Splay 引入 Splay旋转操作splay操作插入操作查询x排名查询排名为x删除操作查询前驱/后继模板Splay时间复杂度分析 进阶操作截取区间区间加&#xff0c;区间赋值&#xff0c;区间查询&#xff0c;区间最值区间翻转原序列整体插入指定位置插入整体插入末尾区间最大子段和 一些好题…

自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍

文章目录 1. 背景介绍2. 功能定义3. 功能原理4. 传感器架构5. 实际应用案例5.1 典型场景1&#xff1a;前方车辆压线5.2 典型场景2&#xff1a;相邻车道有大型车辆5.3 典型场景3&#xff1a;它车近距离cut in 6. 总结与展望 1. 背景介绍 随着汽车技术的发展&#xff0c;智能巡航…

一些常见的网络故障

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

关于我在vue3中使用swiper的使用碰到swiper-slide的width特别大的这件事儿

一. 环境 "vue": "^3.3.8","swiper": "^10.0.4",二. 问题描述 原代码: <template><swiperclass"wq-swiper":space-betwee"spaceBetween":pagination"{ clickable: true }":modules"mod…

Unity发微信小游戏记录

Unity2Wechat 流程1.小程序AppID2.Unity 插件3.微信开发者工具4.CDN资源服 参考文档 流程 1.小程序AppID 已有账号 登陆公众平台获取小程序AppID https://mp.weixin.qq.com/ 无账号 注册小程序 https://developers.weixin.qq.com/minigame/dev/guide/ 经营类目需要是游戏大类…

msvcr120.dll丢失的原因分析,msvcr120.dll丢失的解决方法分享

在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示或程序无法正常运行的问题。其中&#xff0c;msvcr120.dll丢失是一种常见的错误&#xff0c;它会导致某些应用程序无法启动或运行。本文将分析msvcr120.dll丢失的原因&#xff0c;并介绍5种解决方法以及修复过程中…

postman双击打不开的解决方案

postman双击打不开的解决方案 深入再深入 于 2022-05-09 15:45:56 发布 阅读量3.1k 收藏 2 点赞数 4 文章标签&#xff1a; postman 版权 右键属性 安装路径 更新版本 回滚 问题排查 关键词由CSDN通过智能技术生成 解决方案&#xff1a; 右键-属性&#xff0c;复制安装路…

App Inventor 2 天气预报App开发 - 第三方API接入的通用方法(2)

本文来自AppInventor2中文网&#xff08;www.fun123.cn&#xff09;参考文档&#xff0c;调用第三方天气接口获取天气JSON数据&#xff0c;解析并展示在App上。 App效果图&#xff0c;展示未来7日的天气预报&#xff0c;包括日期、天气图示和温度&#xff1a; App原理介绍 通…

RT-DETR+Flask实现目标检测推理案例

今天&#xff0c;带大家利用RT-DETR&#xff08;我们可以换成任意一个模型&#xff09;Flask来实现一个目标检测平台小案例&#xff0c;其实现效果如下&#xff1a; 目标检测案例 这个案例很简单&#xff0c;就是让我们上传一张图像&#xff0c;随后选择一下置信度&#xff0c;…

【博士每天一篇文献-算法】连续学习算法之HNet:Continual learning with hypernetworks

阅读时间&#xff1a;2023-12-26 1 介绍 年份&#xff1a;2019 作者&#xff1a;Johannes von Oswald&#xff0c;Google Research&#xff1b;Christian Henning&#xff0c;EthonAI AG&#xff1b;Benjamin F. Grewe&#xff0c;苏黎世联邦理工学院神经信息学研究所 期刊&a…

解决虚拟机与主机ping不通,解决主机没有vmware网络

由于注册表文件缺失导致&#xff0c;使用这个工具 下载cclean 白嫖就行 https://www.ccleaner.com/ 是 点击修复就可以了

《TF2.x》强化学习手册-P47-P59-TD时序差分-Monte_carlo蒙特卡洛预测与控制算法

文章目录 实现时序差分学习前期准备实现步骤工作原理 构建强化学习中的蒙特卡洛预测和控制算法前期准备实现步骤工作原理 实现时序差分学习 时序差分&#xff08;Temporal Difference &#xff0c;TD&#xff09;算法。TD算法是一种预测值或目标值校正的方法&#xff0c;用于强…

JRT实体视图查询

JRT的设计目标就是多数据库支持&#xff0c;对于爬行周边数据提供DolerGet解决爬取多维数据问题。但是对于通过父表字段筛选子表数据就不能通过DolerGet取数据了&#xff0c;因为查询到的父表数据没有子表数据的ID。 比如下面表&#xff1a; 我需要按登记号查询这个登记号的报…

tree组件实现折叠与展开功能(方式2 - visible计算属性)

本示例节选自vue3最新开源组件实战教程大纲&#xff08;持续更新中&#xff09;的tree组件开发部分。考察Vue3 Composition API形式的计算属性的用法&#xff0c;computed可以单独用在ts文件中&#xff0c;实现ts的计算属性类型的定义。 父节点属性 在IFlatTreeNode中定义父节…

Blackbox AI:你的智能编程伙伴

目录 Blackbox AI 产品介绍 Blackbox AI 产品使用教程 Blackbox AI体验 AI问答 代码验证 实时搜索 探索&代理 拓展集成 总结 Blackbox AI 产品介绍 Blackbox是专门为程序员量身定制的语言大模型&#xff0c;它针对20多种编程语言进行了特别训练和深度优化&#xff0c;在AI代…