当前位置: 首页 > news >正文

牛客多校3 - Journey(建图,最短路)

https://ac.nowcoder.com/acm/contest/33188/J

题意
给定一个 n 个点的图,每个点都是一个十字路口,和相邻的四个十字路口之间连边。

从一条路径经过十字路口直走,左转或者掉头,花费 1 ;右转不花费。

对于每个十字路口 i i i 给出 c i , 1 , c i , 2 , c i , 3 , c i , 4 c_{i,1}, c_{i,2} , c_{i,3} , c_{i,4} ci,1,ci,2,ci,3,ci,4,逆时针依次为相邻的四个十字路口编号。

现在给出出发路径 < s 1 , s 2 > <s1,s2> <s1,s2>,求到达​终点路径 < t 1 , t 2 > <t1,t2> <t1,t2> 的最小花费。

注意路径方向, < a , b > <a,b> <a,b> < b , a > <b, a> <b,a> 不同。

2 ≤ n ≤ 500000 2≤n≤500000 2n500000

思路
把每一条路径看作一个点,然后两条路径之间连边,新边权根据两条路径的位置赋值,重新建图。
每个十字路口最多产生 8 个新点,所以最终点数不超过 8*n,最多产生 12 条新边,所以最终点数不超过 12*n

对于把两个点哈希成一个点,有两种方法:

  1. (x, y) 哈希成 x*n + y,然后用 unordered_map 映射这个大数。
  2. 直接用 map 映射 pair,但是 map 每次查询的复杂度高,而unordered_map不能直接映射pair。但是可以重写 unordered_map 的比较方式后映射 pair。
struct cmp{
	int operator()(PII A)const{
		return A.fi * 521427 + A.se;
	}
};
unordered_map<PII, int, cmp> mp;

Code

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

#define Ios ios::sync_with_stdio(false),cin.tie(0)
#define PII pair<int,int>
#define fi first
#define se second
#define endl '\n'

const int N = 4000010, mod = 1e9+7;
int T, n, m;
int a[4];
vector<PII> e[N];
int st, en;
int f[N], dist[N];
int idx;

struct cmp{
	int operator()(PII A)const{
		return A.fi * 521427 + A.se;
	}
};

unordered_map<PII, int, cmp> mp;

int get(int x, int y){
	if(mp.count({x, y})) return mp[{x, y}];
	mp[{x, y}] = ++idx;
	return idx;
}

void dij()
{
	for(int i=1;i<=idx;i++) dist[i] = 1e9;
	dist[st] = 0;
	
	deque<int> que;
	que.push_front(st);
	
	while(que.size())
	{
		int x = que.front(); que.pop_front();
		if(f[x]) continue;
		f[x] = 1;
		
		for(auto it : e[x])
		{
			int tx = it.fi, dis = it.se;
			if(dist[tx] > dist[x] + dis)
			{
				dist[tx] = dist[x] + dis;
				if(dis) que.push_back(tx);
				else que.push_front(tx);
			}
		}
	}
}

signed main(){
	scanf("%lld", &n);
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<4;j++) scanf("%lld", &a[j]);
		for(int j=0;j<4;j++)
		{
			if(a[j] && a[(j+1)%4]){
				int x = get(a[j], i), y = get(i, a[(j+1)%4]);
				e[x].push_back({y, 0});
				x = get(a[(j+1)%4], i), y = get(i, a[j]);
				e[x].push_back({y, 1});
			}
			
			if(a[j])
			{
				int x = get(a[j], i), y = get(i, a[j]);
				e[x].push_back({y, 1});
//				e[y].push_back({x, 1});
			}
		}
		for(int j=0;j<2;j++)
		{
			if(a[j] == 0 || a[(j+2)%4] == 0) continue;
			int x = get(a[j], i), y = get(i, a[(j+2)%4]);
			e[x].push_back({y, 1});
			x = get(a[(j+2)%4], i), y = get(i, a[j]);
			e[x].push_back({y, 1});
		}
	}
	
	int a, b, c, d;
	scanf("%lld%lld%lld%lld", &a, &b, &c, &d);
	st = get(a, b), en = get(c, d);
	
	dij();
	
	if(dist[en] != 1e9) cout << dist[en];
	else cout << -1;
	
	return 0;
}

经验
要敢想,敢建图!

相关文章:

  • python如何实现数据可视化,如何用python做可视化
  • 开源治理的基本实践与指导原则
  • 【APP测试】怎么对App进行功能测试
  • Mybatis-Plus复习
  • 8、JAVA入门——switch选择结构
  • Inno Setup 创建Revit安装包
  • Windows和Linux使用FRP实现内网穿透
  • c++代码如何实现在win/linux下创建编译及部署后台服务,并管理其他服务
  • UI 自动化测试应不应该投入?有没有前途?怎样做最明智?
  • 股票量化交易有什么优势?
  • 元宇宙电商-NFG系统,是如何用数字藏品平台,促进新营销的?
  • thunderbird102编译-环境搭建(1)
  • curl用法:查看响应时间
  • 房地产基础知识!!!
  • 写一个简单食用的拦截器
  • angular组件开发
  • Git学习与使用心得(1)—— 初始化
  • jquery ajax学习笔记
  • MaxCompute访问TableStore(OTS) 数据
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Spring声明式事务管理之一:五大属性分析
  • v-if和v-for连用出现的问题
  • vue脚手架vue-cli
  • Vue全家桶实现一个Web App
  • 爱情 北京女病人
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 移动端 h5开发相关内容总结(三)
  • 用简单代码看卷积组块发展
  • 函数计算新功能-----支持C#函数
  • 如何正确理解,内页权重高于首页?
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (javascript)再说document.body.scrollTop的使用问题
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (补)B+树一些思想
  • (第二周)效能测试
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (南京观海微电子)——I3C协议介绍
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原創) 物件導向與老子思想 (OO)
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .libPaths()设置包加载目录
  • .net core Swagger 过滤部分Api
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 使用 XPath 来读写 XML 文件
  • .Net 应用中使用dot trace进行性能诊断
  • .NET项目中存在多个web.config文件时的加载顺序
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @EnableAsync和@Async开始异步任务支持