Robocom2021 初赛

news2024/11/24 0:14:12

收录一下Robocom初赛的屌题,调了我一个多小时,是我菜了

题目详情 - 7-3 打怪升级 (pintia.cn)

题意:

 

 

Code:

#include<bits/stdc++.h> 
using namespace std;
 
int n, m, a, b, c, d, q, p;
int f[1005][1005];
 
const int N = 2000000;
int ne[N], w[N], ww[N], e[N], h[N], idx, dist[1005];
bool st[1005];
 
struct node{
	int distance, power, name;
};
 
struct cmp{
	bool operator() (node x, node y){
		if(x.distance != y.distance) return x.distance > y.distance;
		else{
			if(x.power != y.power) return x.power < y.power;
			else return x.name < y.name;
		} 
	}
}; 
 
int pre[1005];//难点1
int pw[1005];//难点2 
 
void add(int a, int b, int c, int d){
	e[idx] = b, w[idx] = c, ww[idx] = d, ne[idx] = h[a], h[a] = idx++;
}
 
void dijk(int s){
	priority_queue<node, vector<node>, cmp> heap;
	heap.push({0, 0, s});
	dist[s] = 0;
	while(heap.size()){
		node head = heap.top();
		heap.pop();
		int ver = head.name, distance = head.distance, power = head.power;
		if(st[ver]) continue;
		st[ver] = 1;
		
		for(int i = h[ver]; i!=-1; i = ne[i]){
			int j = e[i];
			if(distance + w[i] < dist[j]){
				pre[j] = ver;
				dist[j] = distance + w[i];
				pw[j] = power + ww[i];
				heap.push({dist[j], pw[j], j});
			}
			else if(distance + w[i] == dist[j]){
				if(power + ww[i] > pw[j]){
					pre[j] = ver;
					dist[j] = distance + w[i];
					pw[j] = power + ww[i];
					heap.push({dist[j], pw[j], j});
				}
			}
		}
	}
//	cout<<"debug";
}
 
int main(){
	memset(h, -1, sizeof h);
	memset(dist, 127, sizeof dist);
	
	cin>>n>>m;
	memset(f, 63, sizeof f);
	for(int i = 1; i<=m; ++i){
		cin>>a>>b>>c>>d;
		f[a][b] = c;
		f[b][a] = c;
		add(a,b,c,d);
		add(b,a,c,d);
	}
 
	for(int k = 1; k<=n; ++k)
		for(int i = 1; i<=n; ++i)
			for(int j = 1; j<=n; ++j)
				f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
 
	int ans1 = 0;
	int ans1max = 100000000;
	for(int i = 1; i<=n; ++i){
		int curmax = 0;
		for(int j = 1; j<=n; ++j){
			curmax = max(curmax, f[i][j]);
		}
		if(curmax<ans1max){
			ans1 = i;
			ans1max = curmax;
		}
	}
	cout<<ans1<<endl;
 
	dijk(ans1);
	cin>>q;
	for(int i = 1; i<=q; ++i){
		cin>>p;
		vector<int> ans2;
		
		int cur = p;
		while(cur!=ans1){
			ans2.push_back(cur);
			cur = pre[cur];
		}
		ans2.push_back(ans1);
		
		for(int i = ans2.size()-1; i>=0; --i){
			cout<<ans2[i];
			if(i!=0) cout<<"->";
		}
		cout<<"\n";		
		
		cout<<dist[p]<<" "<<pw[p]<<endl;
	}
 
    return 0;
}

 

#include <bits/stdc++.h>

//#define int long long

using namespace std;

const int mxn=2e6+10;
const int mxe=2e6+10;
const int Inf=0x3f3f3f3f;
const int mod=998244353;

struct ty{
	int to,next,w1,w2;
}edge[mxe<<1];

struct ty2{
	//能量,价值
	int x,dist1,dist2;
};

struct cmp{
	bool operator()(ty2 x,ty2 y){
		if(x.dist1!=y.dist1) return x.dist1<y.dist1;
		else{
			if(x.dist2!=y.dist2) return x.dist2<y.dist2;
			else return x.x<y.x;
		}
	}
};

priority_queue<ty2,vector<ty2>,cmp> Q;

int N,M,K,tot=0,u,v,w1,w2,ansmi,x;
int head[mxn];
int dis[1005][1005],vis[mxn];
int dis1[mxn],pw[mxn];
int pre[mxn];

void add(int u,int v,int w1,int w2){
	edge[tot].w1=w1;
	edge[tot].w2=w2;
	edge[tot].to=v;
	edge[tot].next=head[u];
	head[u]=tot++;
}
void G_init(){
	tot=0;
	for(int i=0;i<=N;i++){
		head[i]=-1;
	}
}
void Floyd(){
	for(int k=1;k<=N;k++){
		for(int i=1;i<=N;i++){
			for(int j=1;j<=N;j++){
				if(i==j||i==k||k==j) continue;
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
			}
		}
	}
	int mi=Inf;
	for(int i=1;i<=N;i++){
		int mx=-1;
		for(int j=1;j<=N;j++){
			mx=max(mx,dis[i][j]);
		}
		if(mi>mx){
			mi=mx;
			ansmi=i;
		}
	}
}
void dij(int s){
	//能量,价值
	memset(dis1,0x3f,sizeof(dis1));
	memset(vis,0,sizeof(vis));
	dis1[s]=0;
	Q.push({s,0,0});
	while(!Q.empty()){
		auto u=Q.top();
		Q.pop();
		if(vis[u.x]) continue;
		vis[u.x]=1;
		for(int i=head[u.x];~i;i=edge[i].next){
			if(dis1[edge[i].to]>u.dist1+edge[i].w1){
				dis1[edge[i].to]=u.dist1+edge[i].w1;
				pre[edge[i].to]=u.x;
				pw[edge[i].to]=u.dist2+edge[i].w2;
				Q.push({edge[i].to,dis1[edge[i].to],pw[edge[i].to]});
			}else if(dis1[edge[i].to]==u.dist1+edge[i].w1){
				if(pw[edge[i].to]<u.dist2+edge[i].w2){
					pre[edge[i].to]=u.x;
					dis1[edge[i].to]=u.dist1+edge[i].w1;
					pw[edge[i].to]=u.dist2+edge[i].w2;
					Q.push({edge[i].to,dis1[edge[i].to],pw[edge[i].to]});
				}
			}
		}
	}
}
void solve(){
	cin>>N>>M;
	G_init();
	for(int i=1;i<=N;i++){
		for(int j=1;j<=M;j++){
			if(i==j) dis[i][j]=0;
			else dis[i][j]=Inf;
		}
	}
	for(int i=1;i<=M;i++){
		cin>>u>>v>>w1>>w2;
		dis[u][v]=dis[v][u]=w1;
		add(u,v,w1,w2);
		add(v,u,w1,w2);
	}
	Floyd();
	cout<<ansmi<<'\n';
	dij(ansmi);
	cin>>K;
	for(int i=1;i<=K;i++){
		cin>>x;
		vector<int> ans;
		int cur=x;
		while(cur!=ansmi){
			ans.push_back(cur);
			cur=pre[cur];
		}
		ans.push_back(ansmi);
		for(int i=ans.size()-1;i>=0;i--){
			cout<<ans[i];
			if(i!=0) cout<<"->";
		}
		cout<<'\n';
		cout<<dis1[x]<<" "<<pw[x]<<'\n';
	}
}
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int __=1;//cin>>__;
	while(__--)solve();return 0;
}

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

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

相关文章

Vector - CANoe - 测试报告设置

file:///C:/Program%20Files/Vector%20CANoe%2015/Help01/CANoeCANalyzerHTML5/CANoeCANalyzer.htm#Topics/CANoeCANalyzer/Windows/TestConfigurations/TCConfigTC.htm 前面有过介绍&#xff0c;我们常用的测试报告还是以XML/HTML格式来生成测试报告&#xff0c;而对于XML/HTM…

【洛谷】P1342 请柬(正反建图+dijkstra)

1&#xff1a;思考&#xff1a; 从1到所用顶点简单&#xff08;单源最短路径。&#xff09;&#xff0c;重点在怎么解决所用点到1&#xff08;单终点最短路径&#xff09; 答案&#xff1a;反向建图使&#xff08;单终点最短路径→单源最短路径。&#xff09; 复杂度&#xf…

基于SpringBoot的网上订餐系统【附ppt和开题|万字文档(LW)和搭建文档】

主要功能 前台登录&#xff1a;前台登录&#xff1a; ①首页&#xff1a;菜品信息推荐、菜品信息展示、查看更多 ②菜品信息&#xff1a;菜品分类、菜品名称查询、食材查询、菜品详情、下单提交 ③个人中心&#xff1a;可以查看自己的信息、我的订单、我的地址 后台登录&#…

【杨氏矩阵】

这篇文章的对应思维导图为&#xff1a;思维导图 思维导图对应代码&#xff1a; //杨氏矩阵 #include<stdio.h>//void ysjz1(int a[3][3],int k) { // int x 0; // int y 2; // while (x < 2 && y > 0) { // if (a[x][y] > k) { // y--; // } // …

算法训练营第三十六天||● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

● 435. 无重叠区间 解法1&#xff1a; 本题其实和452.用最少数量的箭引爆气球 (opens new window)非常像&#xff0c;弓箭的数量就相当于是非交叉区间的数量&#xff0c;只要把弓箭那道题目代码里射爆气球的判断条件加个等号&#xff08;认为[0&#xff0c;1][1&#xff0c;…

【嵌入式Qt开发入门】Qt如何网络编程——获取本机的网络信息

Qt 网络模块为我们提供了编写TCP/IP客户端和服务器的类。它提供了较低级别的类&#xff0c;例如代表低级网络概念的 QTcpSocket&#xff0c;QTcpServer 和 QUdpSocket&#xff0c;以及诸如 QNetworkRequest&#xff0c; QNetworkReply 和 QNetworkAccessManager 之类的高级类来…

2023世界人工智能大会,和鲸科技入选中国信通院《2023大模型和AIGC产业图谱》

近日&#xff0c;2023 世界人工智能大会&#xff08;WAIC&#xff09;“聚焦大模型时代 AIGC 新浪潮”论坛上&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;正式发布《2023 大模型和AIGC产业图谱》&#xff08;以下称“图谱”&#xff09;。和…

一、简易搭建本地CAS服务端

CAS服务端war包下载 https://repo1.maven.org/maven2/org/apereo/cas/cas-server-webapp-tomcat/5.3.14/ 可使用迅雷下载cas-server-webapp-tomcat-5.3.14.war &#xff0c;速度很快 将wab包放到本地tomcat的webapps下D:\tomcat\apache-tomcat-8.5.63\webapps\cas\WEB-INF\clas…

springboot项目实战-API接口限流

1.简介 对接口限流的目的是通过对并发访问/请求进行限速&#xff0c;或者对一个时间窗口内的请求进行限速来保护系统&#xff0c;一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。 1.1.为什么需要限流? 大量正常用户高频访问导致服务器宕机恶意用户高频访问导致服…

国产SAAS平台中类似Jira的有哪些值得关注的选择?

在项目管理市场中&#xff0c;Jira是一款非常知名的软件工具。它可以帮助团队成员更好地管理和协作&#xff0c;提高项目效率和质量。然而&#xff0c;Jira并不是完美的&#xff0c;存在诸如复杂操作、高昂费用等不足之处。因此&#xff0c;许多国内企业开始尝试寻找替代品&…

Yolov7配置CoCo精度显示问题实操

1、安装pycocotools工具&#xff0c; 使用yolov7项目中test.py&#xff0c;安装pycocotools时&#xff0c;命令无法直接安装成功。 本次操作在Linux上进行&#xff1a; GitHub - cocodataset/cocoapi: COCO API - Dataset http://cocodataset.org/COCO API - Dataset http:…

uniapp 打包安卓apk (原生App)云打包

uniapp 打包安卓apk (原生App)云打包 hbuilder中操作 项目的一些配置appid DCloud appid 用途/作用/使用说明&#xff1a; https://ask.dcloud.net.cn/article/35907 右键我们项目目录-》发行-》原生APP-云打包 说明&#xff1a; 1. 打包安卓&#xff0c;只选择安卓打包项&…

【Pytest】Allure测试报告的安装与环境配置

文章目录 一、安装配置JAVA环境1、下载jdk2、配置环境变量3、检验 二、安装allure-pytest插件三、下载安装Allure1、下载allure2、配置环境变量3、检验 一、安装配置JAVA环境 Allure基于Java开发&#xff0c;因此需要提前安装Java 8 或以上版本的环境。 1、下载jdk jdk下载地…

2023愚人杯-easy_base

0x00 前言 CTF 加解密合集&#xff1a;CTF 加解密合集 0x01 题目 4C455A5645334C44474A55484D5A42544F5132574956525A50464E464F4E4C474D4656454D334359474A554751564B4949493255535532464E42544643504A350x02 Write Up 直接通过现成的工具即可&#xff1a; 以上

C++教程——STL

STL基本概念 容器算法迭代器 Vector容器 vector存放内置数据类型 vector存放自定义数据类型 vector容器嵌套容器 string容器 string的构造函数 string赋值操作 string字符串拼接 string查找与替换 string字符串比较 string字符存取 string插入与删除 string字串获取

React+Antd+Typescript:封装条件查询组件

文章目录 概要整体架构思路概要 这是筛选组件的效果图。一般使用场景,根据需求快速筛选出符合条件的数据。 那么这个筛选组件,就是默认一些常见的条件,比如明天或者昨天,虽然这个条件,我们可以通过antd的日期控件来实现,但缺点就是操作起来有点麻烦。通过预设一些条件,…

学习记录——BiSeNetV1、BiSeNetV2、BiSeNetV3、PIDNet

BiSeNetV1 BiSeNetV1为了在不影响速度的情况下&#xff0c;同时收集到空间信息和语义信息&#xff0c;设计了两条路&#xff1a; Spatial Path: 用了三层stride为 2 的卷积&#xff0c;卷积BNRELU模块。最后提取了相当于原图像 1/8 的输出特征图。由于它利用了较大尺度的特征图…

C++_简单模拟实现string的增删查改

目录 一、模拟reserve 二、模拟push_back 三、模拟append 四、模拟operator 五、模拟insert 六、模拟erase 七、模拟find 八、模拟substr 一、模拟reserve 要添加数据&#xff0c;首先要考虑的是扩容。有必要用reserve辅助扩容。reserve的作用就是给一个预期的值作为扩…

【雕爷学编程】Arduino动手做(138)---64位WS2812点阵屏模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Vue源码分析拓展 - 响应式系统搭建

Vue里面如何追踪变化 当你把一个普通的JavaScript对象传入Vue实例作为data选项&#xff0c;Vue将遍历此对象所有的属性&#xff0c;并使用Object.defineProperty把这些属性全部转为getter/setter. 这些getter/setter.对用户来说是不可见的&#xff0c;但是在内部他们让Vue能够…