[图论]街道赛跑

news2025/1/12 10:49:59

题目描述


图一表示一次街道赛跑的跑道。可以看出有一些路口(用 0 0 0 N N N 的整数标号),和连接这些路口的箭头。路口 0 0 0 是跑道的起点,路口 N N N 是跑道的终点。箭头表示单行道。运动员们可以顺着街道从一个路口移动到另一个路口(只能按照箭头所指的方向)。当运动员处于路口位置时,他可以选择任意一条由这个路口引出的街道。

在这里插入图片描述

图一:有 10 个路口的街道
一个良好的跑道具有如下几个特点:
1.每一个路口都可以由起点到达。
2.从任意一个路口都可以到达终点。
3.终点不通往任何路口。


运动员不必经过所有的路口来完成比赛。有些路口却是选择任意一条路线都必须到达的(称为“不可避免”的)。在上面的例子中,这些路口是 0 , 3 , 6 , 9 0,3,6,9 0369 。对于给出的良好的跑道,你的程序要确定“不可避免”的路口的集合,不包括起点和终点。


假设比赛要分两天进行。为了达到这个目的,原来的跑道必须分为两个跑道,每天使用一个跑道。第一天,起点为路口 0 0 0 ,终点为一个“中间路口”;第二天,起点是那个中间路口,而终点为路口 N N N 。对于给出的良好的跑道,你的程序要确定“中间路口”的集合。如果良好的跑道 C C C 可以被路口 S S S 分成两部分,这两部分都是良好的,并且 S S S 不同于起点也不同于终点,同时被分割的两个部分满足下列条件:
(1)它们之间没有共同的街道
(2) S S S 为它们唯一的公共点,并且 S S S 作为其中一个的终点和另外一个的起点。那么我们称 S S S 为“中间路口 ”。在例子中只有路口 3 3 3 是中间路口。


输入格式


输入文件包括一个良好的跑道,最多有 50 50 50 个路口, 100 100 100 条单行道。
一共有 N + 2 N+2 N+2 行,前面 N + 1 N+1 N+1 行中第 i i i 行表示以 i − 1 i -1 i1 为起点的街道,每个数字表示一个终点。行末用 − 2 -2 2 作为结束。
最后一行只有一个数字 − 1 -1 1


输出格式


你的程序要有两行输出:
第一行包括:跑道中“不可避免的”路口的数量,接着是这些路口的序号,序号按照升序排列。
第二行包括:跑道中“中间路口”的数量,接着是这些路口的序号,序号按照升序排列。


样例


样例输入1

1 2 -2
3 -2
3 -2
5 4 -2
6 4 -2
6 -2
7 8 -2
9 -2
5 9 -2
-2
-1

样例输出1

2 3 6
1 3

题解

1

关于第 1 1 1 问,求不可避免的点,即去掉该点后不能从起点到终点。
故可以依次枚举每个点,去掉该点后从 0 0 0 进行 dfs,如果不能到终点 N N N,该点就是不可避免的点。


void dfs(int x){
	if(x == n){//能走到 n
		fl = 1;
		return;
	}
	if(fl){
		return;
	}
	//遍历 i 连接的边
	for(auto i : v[x]){
		if(!f[i]){
			f[i] = 1;
			dfs(i);
			f[i] = 0;
		}
	} 
}
for(int i = 1; i < n; ++ i){
	//fl 标记能不能到终点
	fl = 0;
	//标记 dfs 中走没走到某点的数组
	memset(f, 0, sizeof(f));
	//将 i 标记为 1,相当于把 i 删掉
	f[i] = 1;
	f[0] = 1;
	dfs(0);
	//不可避免的点
	if(fl == 0){
		q[++ l] = i;
	}
}

2

关于第 2 2 2 问,求中间路口。

如果第 i i i 个点是中间路口,就必须保证第 i i i 个点是不可避免的点。如果第 i i i 个点不是不可避免的点,那么一定存在至少一条路径能直接从 0 0 0 n n n

问题变为了如何求两部分间是否有共同的街道。

先把第 i i i 个点堵上,从 0 0 0 开始 dfs,将所有能走到的点标记为 1 1 1,即第 1 1 1 天能到的点。
再从第 i i i 个点进行遍历,如果当前走到的点已经标记为 1 1 1 了,则该点不为中间路口。

void dfs1(int x){
	//标记遍历的点
	f[x] = 1;
	f1[x] = 1;
	for(auto i : v[x]){
		if(!f[i]){
			dfs1(i);
		}
	} 
	f[x] = 0;
}
int fl2 = 1;
void dfs2(int x){
	//碰到标记的点
	if(f1[x] == 1){
		fl2 = 0;
		return;
	}
	if(!fl2){
		return;
	}
	//标记为 2
	f1[x] = 2;
	f[x] = 1;
	for(auto i : v[x]){
		if(!f[i]){
			dfs2(i);
		}
	} 
	f[x] = 0;
}
for(int i = 1; i <= l; ++ i){
	//清空
	fl2 = 1;
	memset(f, 0, sizeof(f));
	memset(f1, 0, sizeof(f1));
	f1[q[i]] = 2;
	f[q[i]] = 1; 
	f[0] = 1;
	dfs1(0);
	memset(f, 0, sizeof(f));
	dfs2(q[i]);
	//中间路口
	if(fl2){
		q2.push(q[i]);
	}
}

综上,我们就可以得到代码了。

#include<bits/stdc++.h>
using namespace std;
int n;
vector<int> v[60];//存图
dfs;
dfs1;
dfs2;
int main(){
	for(n = 0; ; ++ n){
		bool p = 0;
		int g;
		while(scanf("%d", &g) != EOF){
			if(g == -2){
				break;
			}
			if(g == -1){
				p = 1;
				break;
			}
			v[n].push_back(g);
		}
		if(p){
			break; 
		} 
	}
	-- n;
	# 1
	输出 q
	# 2
	输出 q2
	return 0;
}

禁止抄袭!!!

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

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

相关文章

自测的重要性

1、把debug一遍&#xff0c;看看每一步变量值的变化都符合预期 2、核对需求文档&#xff0c;看看是不是自己的逻辑跟需求都是匹配的&#xff0c;有没有遗漏的细节 3、有时候配合接口的使用方去做点假数据&#xff0c;也是发现自己接口漏洞的好机会 发现了sql少写了个条件、发…

【Go】Go语言中的流程控制语句

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Python识别拖放的PDF文件再转成文本文件

日常工作中经常用到PDF文件&#xff0c;有些PDF文件的文字是不能复制的&#xff0c;为了复制这些文字&#xff0c;我们需要转化PDF文件&#xff0c;或者采用微信的OCR图片识别文字&#xff0c;这样非常不方便。为此&#xff0c;我编写了一个Python小程序&#xff0c;利用Tkinte…

基于51单片机的多功能台灯Protues仿真设计

目录 一、设计背景 二、设计要求 三、仿真演示 四、程序展示 一、设计背景 随着科技的飞速发展和智能家居的普及&#xff0c;传统的台灯已经难以满足现代消费者对照明设备的多样化需求。传统台灯的功能主要集中在提供基本的照明效果&#xff0c;其操作方式通常是通过手动调…

Langchain.js你必须要知道的核心组件

关于Langchain.js Langchain.js&#xff0c;在github上截止到今日已经有92k的start。之前一直偶有耳闻&#xff0c;但没有深入了解。今天看完后&#xff0c;真的是可以堪称大模型里的瑞士军刀。 LangChain由Harrison Chase于2022年10月作为开源软件项目推出&#xff0c;用于连…

抗菌肽;Parasin I;KGRGKQGGKVRAKAKTRSS;CAS号:219552-69-9

【Parasin I 简介】 Parasin I是一种抗菌肽&#xff0c;由19个氨基酸组成&#xff0c;最初从鲶鱼的皮肤粘液中分离得到。它具有广谱的抗菌活性&#xff0c;能够有效对抗革兰氏阳性菌和革兰氏阴性菌&#xff0c;包括一些对传统抗生素具有耐药性的菌株。 【中文名称】抗菌肽 Par…

C语言 11 字符串

前面学习了数组&#xff0c;而对于字符类型的数组&#xff0c;比较特殊&#xff0c;它实际上可以作为一个字符串&#xff08;String&#xff09;表示&#xff0c;字符串就是一个或多个字符的序列&#xff0c;比如在一开始认识的"Hello World"&#xff0c;像这样的多个…

如何编写智能合约——基于长安链的Go语言的合约开发

场景设计&#xff1a;文件存证系统 在数字化时代&#xff0c;文件存证和版本追踪变得越来越重要。设想一个场景&#xff1a;在一个法律事务管理系统中&#xff0c;用户需要提交和管理各种文件的版本记录&#xff0c;以确保每个文件在不同时间点的状态可以被准确追踪。文件可能经…

抖音生活服务是干什么的?很多人都不知道的入局途径曝光!

近年来&#xff0c;作为国内两大头部短视频平台之一的抖音一直在大力布局其生活服务业务&#xff0c;壮大自身实力的同时&#xff0c;也让不少人开始好奇抖音生活服务的概念&#xff0c;以抖音生活服务是干什么的和如何做抖音生活服务为代表多个相关话题因此成为了多个互联网社…

客户端负载均衡Ribbon实例

文章目录 一&#xff0c;概述二&#xff0c;实现过程三&#xff0c;项目源码1. 源码放送&#xff1a;2. 部署方式 四&#xff0c;功能演示五&#xff0c;其他 一&#xff0c;概述 一般来说&#xff0c;提到负载均衡&#xff0c;大家一般很容易想到浏览器 -> NGINX -> 反…

记一次 FastDFS 存储节点迁移:基于 scp 的实践与经验分享

一、背景 某某项目&#xff0c;机房到期&#xff0c;需要迁移至其他机房&#xff1b; 此项目已经运行了3年多&#xff0c;fastdfs累计数据大概在250G 左右&#xff0c;现需要把旧的fastdfs数据迁移到新的fastdfs上&#xff1b; 采用scp物理迁移数据的方式&#xff0c;停机迁移…

技术分享 | RK3568修改eMMC分区大小

我司IAC-RK3568-CM根据eMMC大小的不同&#xff0c;有着不同规格的产品&#xff0c;不论eMMC大小如何改变&#xff0c;其分区的配置大同小异&#xff0c;除了eMMC厂商所使用的区域无法变更外&#xff0c;留给用户的区域可自由写入。 我司产品默认eMMC启动&#xff0c;所以eMMC用…

【AI-18】Adam和SGD优化算法比较

Adam&#xff08;Adaptive Moment Estimation&#xff09;和 SGD&#xff08;Stochastic Gradient Descent&#xff0c;随机梯度下降&#xff09;是两种常见的优化算法&#xff0c;它们在不同方面有各自的特点。 一、算法原理 SGD&#xff1a; 通过计算损失函数关于每个样本的…

干货分享 | 激光测风雷达中准确监测温度、湿度和气压的重要性

前言 风场信息的测量是气象或空气动力学领域的重要工作内容之一&#xff0c;其测量的精确性对于气象研究尤为重要。 激光测风雷达作为新型测风技术&#xff0c;利用多普勒&#xff08;Doppler&#xff09;原理获取风向、风速信息&#xff0c;具有能够探测晴空风场、测风范围广…

element select + tree

element select tree的使用 <template slot"action1" slot-scope"text, record, index"><el-select v-model"record.tagValue" multiple placeholder"请选择":filter-method"(e) > filterTree(e, index)" filt…

5分钟配置Nginx?(二)

前言: 此文章分为两个部分。 5分钟搞懂什么是Nginx?(一)-CSDN博客文章浏览阅读82次。2.、那么此时入口的安全性则格外重要,同时因为加强了入口的安全性,后端的web server的安全则可以不用做额外安全工作。因为入口如果破防,后端web server一定破防,如果不…

支付宝开放平台-开发者社区——AI 日报「9 月 13 日」

1 OpenAl推出了一个新的大语言模型一 OpenAl o1 前沿技术瞭望官&#xff5c;阅读原文 新的模型主要体现在下面几个方面&#xff0c;思维链&#xff1a;o1在回答问题前会产生一个内部的思维链&#xff0c;这使得它能够进行更深入的推理。强化学习&#xff1a;通过大规模强化学…

Linux操作系统入门(一)

Linux操作系统是开源的类Unix操作系统内核&#xff0c;由林纳斯托瓦兹在1991年创建。 Linux操作系统以其强大的性能、稳定性和开放性&#xff0c;赢得了全球用户的广泛认可&#xff0c;从服务器到个人电脑&#xff0c;从超级计算机到嵌入式设备&#xff0c;都有它的身影。作为…

停止向供应商提供您的数据

组织管理其数据基础设施的方式正在发生重大转变。越来越多的公司认识到存储和计算分离的优势&#xff0c;从而获得更好的性能、成本节约和可扩展性。这一趋势是由 AI 和 ML 工作负载日益复杂所推动的&#xff0c;这些工作负载需要灵活、高性能的系统。Databricks 首席执行官 Al…

自定义Spring-start学习笔记

Spring Boot Start的创建和使用 start的工作原理(网图) 1. 设置Maven项目&#xff1a; 创建一个新的Maven或Gradle项目&#xff0c;并在项目的pom.xml文件中添加必要的Spring Boot依赖项和插件。下面以maven项目为例&#xff1a; 创建Spring Boot项目 &#xff0c;并在项目的…