问题 D: 是否为有效的拓扑序列

news2024/11/26 20:21:36

题目描述

在一个有向无环图中,可能存在多种有效拓扑序列。以下图为例:

存在两种可行的拓扑序列:
0 1 2 3 4
0 2 1 3 4
本题会给出一个图,以及多个序列,你来判断每一个序列是否是该图的有效拓扑序列。 

输入格式

第一行为2个正整数m和n,分别表示有向无环图的节点个数和边的数量。
接下来n行,代表n条边。分别是起点、终点、权重,以空格分隔。
(m<50,n<100)
接下来为一个正整数o,表示接下来会出现的序列个数。
(o<1000)
再往后是o个序列,序列中的每个值用空格隔开。

输出格式

按行输出:o个序列中,每一个序列是否为图的有效拓扑序列。
是的话输出:YES
不是的话输出:NO

输入样例

5 6
0 1
0 2
1 3
2 3
2 4
3 4
3
0 1 2 3 4
0 2 1 3 4
0 1 3 2 4

输出样例  

YES
YES
NO

代码展示 

思路:循环判断当前结点入度,为零则将其邻接点入度-1,继续判断给定序列的下一结点。若为有效拓扑序列,(入度)则应按序陆续减为0;否则无效。

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

#define INFO_MAX_SIZE 20
#define MAX_SIZE 200
 //领接矩阵存储的图
struct Graph{
	int vexNumber;
	string vexInfo[INFO_MAX_SIZE];
	int adjMatrix[MAX_SIZE][MAX_SIZE];
};
 //弧结点定义
struct ArcNode{
	int weight;//弧上的信息部分
	int adj;//邻接点的序号
	ArcNode *nextarc;
};
 //顶点结点定义
struct VexNode{
	string Info;
	ArcNode *firstarc;
};
 //领接表结构的图的定义
struct linkGraph{
	VexNode *vexes;
	int vexnumber;
};

struct tempNode{
	int col;
	int row;
	//tempNode *next;
};

struct temp{
	int num;
	tempNode *docu;
};


int preInitGraph(linkGraph &G,const Graph &g){
	G.vexes=new VexNode[g.vexNumber];
	G.vexnumber=g.vexNumber;
	for(int i=0;i<g.vexNumber;i++){
		G.vexes[i].firstarc=NULL;
	}
	return 0;
}
//将邻接矩阵存储的图转换为领接表存储的图
void InitGraph(linkGraph &G,const Graph &g,temp &t){
	preInitGraph(G,g);
	for(int i=0;i<t.num;i++){
		int a,b;
		a=t.docu[i].row;b=t.docu[i].col;
		ArcNode *p=new ArcNode();
		p->nextarc=NULL;
		p->adj=b;
		ArcNode *q=G.vexes[a].firstarc;
		if(G.vexes[a].firstarc==NULL)
			G.vexes[a].firstarc=p;
		else{
			while(q->nextarc!=NULL){
				q=q->nextarc;
			}
			q->nextarc=p;
		}
	}
}

//输出领接表存储的图
void PrintGraph(const linkGraph &G){
	for(int i=0;i<G.vexnumber;i++){
		cout<<G.vexes[i].Info;
		ArcNode *p=G.vexes[i].firstarc;
		cout<<i;
		while(p!=NULL){
			cout<<" --> "<<p->adj;
			p=p->nextarc;
		}
		cout<<endl;
	}
}

int check(linkGraph LG,int a[],int indegree[]){
	//PrintGraph(LG);
	int temp[LG.vexnumber]={0};
	for(int i=0;i<LG.vexnumber;i++)  temp[i]=indegree[i];
	for(int i=0;i<LG.vexnumber;i++){
		if(temp[a[i]]!=0)  return 1;
		for(ArcNode *p=LG.vexes[a[i]].firstarc;p!=nullptr;p=p->nextarc){
			temp[p->adj]--;
		}
	}
	return 0;
}


int main(){
	//freopen("/config/workspace/test/test","r",stdin);
	int n,m;
	cin>>n>>m;

	Graph G;
	G.vexNumber=n;
	temp t;
	t.num=m;
	t.docu=new tempNode[m];
	for(int i=0;i<m;i++){
		int a,b;
		cin>>a>>b;
		t.docu[i].row=a;
		t.docu[i].col=b;
	}
	linkGraph LG;
	InitGraph(LG,G,t);
	int indegree[LG.vexnumber]={0};
	//for(int i=0;i<LG.vexnumber;i++) indegree[i]=0;
	for(int i=0;i<LG.vexnumber;i++){
		for(ArcNode *p=LG.vexes[i].firstarc;p!=nullptr;p=p->nextarc)
			indegree[p->adj]++;
	}//入度
	int k;
	cin>>k;
	for(int i=0;i<k;i++){
		int a[n];
		for(int j=0;j<n;j++){
			cin>>a[j];
		}
		int flag=check(LG,a,indegree);
		if(flag)  cout<<"NO"<<endl;
		else  cout<<"YES"<<endl;
	}
	
	
	return 0;
}

//闲叙题外话:这周事情好多啊。

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

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

相关文章

(Transferrin)TF-PEG-PCL/PLA/PAA 转铁蛋白-聚乙二醇-聚已内酯/聚乳酸/聚丙烯酸

产品名称&#xff1a;转铁蛋白-聚乙二醇-聚已内酯 英文名称&#xff1a;TF-PEG-PCL;Transferrin-PEG-PCL 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体&#xff0c;取决于分子量 PEG分子量可选&#xff1a;350、550、75…

外汇天眼:美国10月份成屋销售连续第九个月下降!利率上升和通胀飙涨吓跑潜在买家!

10月份美国房屋销售连续第9个月下滑&#xff0c;因利率上升和通胀飙升令买家持观望态度。 具体付 全美房地产经纪人协会(National Association of Realtors)的数据显示&#xff0c;9月至10月&#xff0c;成屋销售下降5.9%。这是自2011年12月以来的最慢速度&#xff0c;除了在C…

企业真实面试:父子类之间到底是怎么实例化的?

一. 问题展现 今天有粉丝向波哥询问了这样一道题目&#xff0c;这道题目是粉丝在面试时遇到的&#xff0c;如下图所示&#xff1a; 波哥把上图这道题目的考察重点给大家梳理一下&#xff1a; 有一个父类People&#xff0c;它有一个子类Child&#xff1b; 父类的的无参构造方法…

Redis——》过期删除策略

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》过期删除策略一、过期删除策略1、定时删除2、惰性删除3、定期删…

通达信交易dll接口怎么实现程序化交易?

现在很多交易者选择量化投资与传统的股票交易之间&#xff0c;往往会选择自动化交易跟量化交易的比较多&#xff0c;毕竟现在很多可以开发出来的交易软件都具备了量化的特点&#xff0c;能够及时的把握更多的盈利的机会&#xff0c;就比如说常使用的到通达信交易dll接口就是一个…

LeetCode | 850. 矩形面积 II

我们给出了一个&#xff08;轴对齐的&#xff09;二维矩形列表 rectangles 。 对于 rectangle[i] [xi1, yi1, xi2, yi2], 表示第 i 个矩形的坐标&#xff0c; (xi1, yi1) 是该矩形 左下角 的坐标&#xff0c; (xi2, yi2) 是该矩形 右上角 的坐标。 计算平面中所有 rectangles…

java maven pom application 生产prod/开发dev/测试test

前言 pom 和 application.properties&#xff08;application.yml)里的定义的环境不太一样&#xff0c; pom 是maven对应的配置文件&#xff0c;编译阶段使用 application.properties&#xff08;application.yml) 是Spring配置文件&#xff0c;程序运行阶段使用 POM pom文…

每次打开百度太麻烦?用程序直接打开网页 Python实现百度划词搜索功能(获取剪切板数据)

浏览顺序实现划词功能运行错误解决问题转载声明实现划词功能 说是划词翻译&#xff0c;实际上我们是通过获取用户的剪切板内容&#xff0c;通过一系列的操作得到的。首先呢&#xff0c;我们就先实现如何获取剪切板内容的程序 首先先在桌面创建一个文件夹&#xff0c;命名为“…

pac自动代理

文章目录1.pac 定义2. 参考配置地址3. 实际配置案例3.1 编写pac文件3.1.1 return 语句有三种指令&#xff1a;3.1.2 内置函数3.1.2.1 dnsDomainIs3.1.2.2 shExpMatch3.1.2.3 isInNet3.1.2.4 主机ip3.1.2.5 dnsResolve3.1.2.6 isPlainHostName3.1.2.7 isResolvable3.1.2.8 dnsDo…

RabbitMQ初步到精通-第十章-RabbitMQ之Spring客户端源码

目录 第十章-RabbitMQ之Spring客户端源码 1. 前言 2. 客户端消费代码 2.1 消费的实现方式 2.2 消费中注解解释 2.3 推测Spring实现过程 3.MQ消费源码分析 3.1 集成SpringBoot 启动过程 3.2 Broker投递消息给客户端过程 3.3 客户端消费过程 4. 总结 第十章-RabbitMQ之S…

【Linux】线程安全

文章目录1.线程互斥1.1.线程间互斥的相关概念1.2互斥量1.3互斥量接口1.4互斥量实现原理2.可重入VS线程安全3.常见锁概念3.1死锁3.2常见死锁情况3.2.1情况一&#xff1a;忘记释放锁3.2.2情况二&#xff1a;线程重复申请锁3.2.3情况三&#xff1a;双线程多锁申请3.3锁的相关概念4…

m在VBLAST协作MIMO系统分部使用LDPC,Turbo,卷积三种信道编译码进行误码率matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 从上面的结构可知&#xff0c;整个卷积编码的结构可由CRC校验&#xff0c;卷积编码&#xff0c;打孔组成&#xff0c;其中打孔的作用就是讲卷积编码后的码率变为所需要的码率进行发送。 …

一种在行末隐藏有效载荷的新供应链攻击技术研判

近期&#xff0c;Phylum检测到数十个新发布的Pypi软件包执行供应链攻击&#xff0c;在这些软件包中&#xff0c;通过隐藏的__import__将窃取程序投递到开发人员的机器上。攻击者利用代码审核者所使用IDE默认的不换行代码显示设置隐藏自身的行为与载荷&#xff0c;本文将就其中出…

栈简介、手写顺序栈、手写链栈和栈的应用

一. 简介 1. 什么是栈&#xff1f; 栈是一种只能从表的一端存取数据且遵循 "先进后出"&#xff08;"后进先出"&#xff09; 原则的线性存储结构。栈也是用来存储逻辑关系为 "一对一" 数据的线性存储结构。 C#中提供顺序栈&#xff1a;Stack&…

【MySQL基础】如何安装MySQL?如何将MySQL设置成服务?

目录 一、MySQL的安装 1、解压配置 2、步骤安装 &#x1f49f; 创作不易&#xff0c;不妨点赞&#x1f49a;评论❤️收藏&#x1f499;一下 一、MySQL的安装 MySQL的安装有两种方式&#xff1a;解压配置和步骤安装 1、解压配置 需提前从官网直接下载压缩包&#xff0c;进…

【MySQL篇】第二篇——库的操作

目录 创建数据库 创建数据库案例 字符集和校验规则 查看系统默认字符集以及校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 校验规则对数据库的影响 操纵数据库 查看数据库 显示创建语句 修改数据库 数据库删除 备份和恢复 备份 还原 注意事…

常见磁盘调度算法总结

磁盘调度算法&#x1f4d6;1. 最短寻道时间优先&#xff08;SSTF&#xff09;&#x1f4d6;2. 电梯算法&#xff08;SCAN或C-SCAN&#xff09;&#x1f4d6;3. 最短定位时间优先&#xff08;SPTF&#xff09;&#x1f4d6;4. 总结由于IO的高成本&#xff0c;操作系统在决定发送…

C语言 0 —— 计算机硬件架构及信息在计算机中的表示

当前的计算机系统&#xff0c;如Window &#xff0c;Linux&#xff0c;Mac 基本都是基于冯诺依曼的驱动架构设计的。 冯诺依曼架构输入设备先输入公式&#xff0c;给运算器&#xff0c;运算器先算 先算2*5 &#xff0c;临时放在CPU内部寄存器中&#xff0c;寄存器不够用的时候会…

vscode插件开发(四)Webview(1)

上一篇详细讲解了命令&#xff0c;这回我们一起来看一下Webview。vscode的插件其实可以分为两种&#xff0c;一种是webview插件&#xff0c;另一种是非webview插件。 webview插件的自由度很高&#xff0c;可以满足开发者的各种定制化的要求&#xff1b;而非webview插件只能使用…

我悟了!Mysql事务隔离级别其实是这样!

问题描述 ​ 最近几天在忙项目&#xff0c;有个项目是将业务收集到的数据变动&#xff0c;异步同步到一张数据表中。在测试的过程时&#xff0c;收到QA的反馈&#xff0c;说有订单的数据同步时好时坏。我怀着疑惑的表情打开了那段代码&#xff0c;它的逻辑大概是这样的&#x…