HDU - 3499 - Flight (分层图最短路 + map)

2024-02-11 02:38
文章标签 分层 map 短路 hdu flight 3499

本文主要是介绍HDU - 3499 - Flight (分层图最短路 + map),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3499

题意:n个城市m条单向边!!!然后给你这M条单向边。最后输入起点终点,你有一次机会可以使某条边的花费减半,问起点到的最短路为多少?如果没有路可以到达输出“-1”。

思路:用map映射相应的地点,然后套分层图最短路模板。注意开long long。

直接建图AC代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+7;
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f
#define pii pair<int, int>
int n, m, s, t;
ll d[maxn]; int vis[maxn];
vector<pii>E[maxn];
void init()
{for(int i = 0; i <= n*2; i++) E[i].clear();memset(d,127,sizeof(d));memset(vis,0,sizeof(vis));
}
void Dijkstra()
{d[s] = 0;priority_queue<pii> Q;Q.push({-d[s],s});while(!Q.empty()){int now = Q.top().second;Q.pop(); if(vis[now]) continue;vis[now] = 1;for(int j = 0; j < E[now].size(); j++){int v = E[now][j].first;if(!vis[v] && d[v] > d[now]+E[now][j].second){d[v] = d[now]+E[now][j].second;Q.push({-d[v],v});}}}
}
int main()
{while(~scanf("%d%d",&n,&m)){init();string a, b; int x, p = 0;map <string, int> mp;while(m--){cin >> a >> b >> x;if(!mp.count(a)) mp[a] = p++;if(!mp.count(b)) mp[b] = p++;E[mp[a]].push_back({mp[b],x});E[mp[a]+n].push_back({mp[b]+n,x});E[mp[a]].push_back({mp[b]+n,x/2});}cin >> a >> b;if(!mp.count(a) || !mp.count(b)){puts("-1"); continue;}s = mp[a], t = mp[b];Dijkstra(); printf("%lld\n", d[t+n]);}return 0;
}

多开一维AC代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
#define ll long long
#define inf 9187201950435737471
#define pii pair<ll, ll>
int n, m, s, t, k;
ll d[maxn][5]; int vis[maxn][5];
vector<pii>E[maxn];
void init()
{for(int i = 0; i <= n; i++) E[i].clear();memset(d,127,sizeof(d));memset(vis,0,sizeof(vis));
}
void Dijkstra()
{d[s][0] = 0;priority_queue<pii> Q;Q.push({0,s});while(!Q.empty()){int now = Q.top().second; Q.pop();int c = now / n; now %= n;if(vis[now][c]) continue;vis[now][c] = 1;for(int j = 0; j < E[now].size(); j++){int v = E[now][j].first;if(!vis[v][c] && d[v][c] > d[now][c]+E[now][j].second){d[v][c] = d[now][c] + E[now][j].second;Q.push({-d[v][c],v + c * n});}}if(c < k){for(int j = 0; j < E[now].size(); j++){int v = E[now][j].first;if(!vis[v][c+1] && d[v][c+1] > d[now][c]+E[now][j].second/2){d[v][c+1] = d[now][c] + E[now][j].second/2;Q.push({-d[v][c+1],v + (c+1) * n});}}}}
}
int main()
{while(~scanf("%d%d",&n,&m)){init();string a, b; ll x; int p = 0;map <string, int> mp;while(m--){cin >> a >> b >> x;if(!mp.count(a)) mp[a] = p++;if(!mp.count(b)) mp[b] = p++;E[mp[a]].push_back({mp[b],x});}cin >> a >> b; k = 1;if(!mp.count(a) || !mp.count(b)){puts("-1"); continue;}s = mp[a], t = mp[b];Dijkstra(); printf("%lld\n", d[t][1]);}return 0;
}

 

这篇关于HDU - 3499 - Flight (分层图最短路 + map)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698622

相关文章

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

JavaScript中的Map用法完全指南

《JavaScript中的Map用法完全指南》:本文主要介绍JavaScript中Map用法的相关资料,通过实例讲解了Map的创建、常用方法和迭代方式,还探讨了Map与对象的区别,并通过一个例子展... 目录引言1. 创建 Map2. Map 和对象的对比3. Map 的常用方法3.1 set(key, v

Golang中map缩容的实现

《Golang中map缩容的实现》本文主要介绍了Go语言中map的扩缩容机制,包括grow和hashGrow方法的处理,具有一定的参考价值,感兴趣的可以了解一下... 目录基本分析带来的隐患为什么不支持缩容基本分析在 Go 底层源码 src/runtime/map.go 中,扩缩容的处理方法是 grow

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添