HDU-3499Flight (分层图dijkstra)
一开始想的并查集(我一定是脑子坏掉了),晚上听学姐讲题才知道就是dijkstra两层;
题意:有一次机会能使一条边的权值变为原来的一半,询问从s到e的最短路。
将dis数组开成二维,第一维表示从源点到点i的路径长度,第二维表示是否使用了该次机会,并以此不断更新。
用map将字符串转为int,剩下的就是dijkstra+优先队列;
#include<cstdio>
#include<cstring>
#include<iostream>
#include<map>
#include<queue>
#define ll long long
#define INF 1e18
using namespace std; const int N = 1e5+10;
const int M = 5e5+10;
int tot,m,n; struct Edge
{
int v, cost, next;
}edge[M]; struct qnode
{
int loc,level;
ll dis;
bool operator < (const qnode &t) const {
return dis > t. dis;
}
qnode(int a=0,int b=0,ll c=0){
loc=a,level=b,dis=c;
}
}d[N][2]; int head[M];
bool vis[N][2]; void addedge(int u, int v, ll w)
{
edge[tot]. v = v;
edge[tot]. cost = w;
edge[tot]. next = head[u];
head[u] = tot ++;
} void dijkstra(int st)
{
memset(vis, 0, sizeof(vis));
for(int i=1;i<=n;i++){
for(int j=0;j<=1;j++){
d[i][j].dis=INF;
}
}
d[st][0].dis = 0;
priority_queue <qnode> q;
q. push(qnode(st,0,0));
while(! q. empty()){
qnode t = q. top();
q. pop();
int t1=t.loc,t2=t.level;
if(vis[t1][t2])continue;
vis[t1][t2]=true;
for(int i = head[t1]; i != -1; i = edge[i]. next){
int v = edge[i]. v;
int cost = edge[i]. cost;
if( d[v][t2].dis > d[t1][t2].dis + cost){
d[v][t2].dis = d[t1][t2].dis + cost;
q. push(qnode(v,t2,d[v][t2].dis));
}
if(t2==0&&d[v][t2+1].dis>d[t1][t2].dis+cost/2){ //分别记录每一段是半价的价格
d[v][t2+1].dis=d[t1][t2].dis+cost/2;
q.push(qnode(v,t2+1,d[v][t2+1].dis));
}
}
}
} int main(){
while(scanf("%d%d", &n, &m)!=EOF){
string a,b;
map<string,int> cnt;
cnt.clear();
ll c;
tot = 1;
int k=1;
memset(head, -1, sizeof(head));
while(m --){
cin>>a>>b>>c;
if(!cnt[a])cnt[a]=k++;
if(!cnt[b])cnt[b]=k++;
addedge(cnt[a], cnt[b], c);
}
cin>>a>>b;
if(!cnt[a])cnt[a]=k++;
if(!cnt[b])cnt[b]=k++;
if(m==0) {
printf("-1\n");
continue;
}
dijkstra(cnt[a]);
ll ans=min(d[cnt[b]][0].dis,d[cnt[b]][1].dis);
if(ans==INF) printf("-1\n");
else printf("%lld\n",ans);
}
return 0;
}
HDU-3499Flight (分层图dijkstra)的更多相关文章
- [USACO09FEB] Revamping Trails 【分层图+Dijkstra】
任意门:https://www.luogu.org/problemnew/show/P2939 Revamping Trails 题目描述 Farmer John dutifully checks o ...
- 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa
3627: [JLOI2014]路径规划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 186 Solved: 70[Submit][Status] ...
- bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级——分层图+dijkstra
Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i ...
- bzoj1922 [SDOI2010]大陆争霸 分层图
问题描述 幻想历8012年5月12日深夜,斯普林·布拉泽降下神谕:“Trust me, earn eternal life.”克里斯军团士气大增.作为克里斯军团的主帅,你决定利用这一机会发动奇袭,一举 ...
- hdu 3499 flight 【分层图】+【Dijkstra】
<题目链接> 题目大意: 现在给你一些点,这些点之间存在一些有向边,每条边都有对应的边权,有一次机会能够使某条边的边权变为原来的1/2,求从起点到终点的最短距离. 解题分析: 分层图最短路 ...
- Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路
2834: 回家的路 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 62 Solved: 38[Submit][Status][Discuss] D ...
- Bzoj 2662: [BeiJing wc2012]冻结 dijkstra,堆,分层图,最短路
2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 647 Solved: 348[Submit][Sta ...
- Bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 dijkstra,堆,分层图
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1573 Solv ...
- HDU 5669 Road(线段树建树)(分层图最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5669 [分析]线段树建树+分层图最短路 #include <cstdio> #includ ...
随机推荐
- 从Java的字符串池、常量池理解String的intern()
前言 逛知乎遇到一个刚学Java就会接触的字符串比较问题: 通常,根据"==比较的是地址,equals比较的是值"介个定理就能得到结果.但是String有些特殊,通过new Str ...
- Shiro的认证与授权
shiro实战教程 一.权限管理 1.1什么是权限管理 基本上涉及到用户参与的系统都需要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以 ...
- mmall商城用户模块开发总结
1.需要实现的功能介绍 注册 登录 用户名校验 忘记密码 提交问题答案 重置密码 获取用户信息 更新用户信息 退出登录 目标: 避免横向越权,纵向越权的安全漏洞 MD5明文加密级增加的salt值 Gu ...
- 天梯赛练习 L3-016 二叉搜索树的结构 (30分)
题目分析: 用数型结构先建树,一边输入一边建立,根节点的下标为1,所以左孩子为root*2,右孩子为root*2+1,输入的时候可用cin输入字符串也可用scanf不会超时,判断是否在同一层可以判断两 ...
- python模块详解 | filecmp
简介: filecmp是python内置的一个模块,用于比较文件及文件夹的内容,它是一个轻量级的工具,使用非常简单 两个主要的方法: filecmp.cmp(f1, f2[, shallow]) 比较 ...
- 安装MySQL数据库(在Windows下通过zip压缩包安装)
安装MySQL 这里建议大家使用压缩版,安装快,方便.不复杂. 软件下载 mysql5.7 64位下载地址: https://dev.mysql.com/get/Downloads/MySQL-5.7 ...
- 【Linux】find删除365天以前的文件详细解析
find . -name "*" -mtime +365 -exec rm -rf {} \; -mtime +365 文件被修改的时间,最后一次发生到现在365天 -atime ...
- Java高并发与多线程(四)-----锁
今天,我们开始Java高并发与多线程的第四篇,锁. 之前的三篇,基本上都是在讲一些概念性和基础性的东西,东西有点零碎,但是像文科科目一样,记住就好了. 但是本篇是高并发里面真正的基石,需要大量的理解和 ...
- 网络基础知识之Cisco
2021-01-2313:35:21 大家好,我是新手,刚学完Cisco协议,以后,我会每天都会给大家一些学习笔记 和一些学习心得,这方面不会的可以找我.qq2934896930. 网络的定义: 计算 ...
- 正则re高级用法
search 需求:匹配出文章阅读的次数 #coding=utf-8 import re ret = re.search(r"\d+", "阅读次数为 9999" ...