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

相关文章

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: 添

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和