一开始想的并查集(我一定是脑子坏掉了),晚上听学姐讲题才知道就是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)的更多相关文章

  1. [USACO09FEB] Revamping Trails 【分层图+Dijkstra】

    任意门:https://www.luogu.org/problemnew/show/P2939 Revamping Trails 题目描述 Farmer John dutifully checks o ...

  2. 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

    3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status] ...

  3. bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级——分层图+dijkstra

    Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i ...

  4. bzoj1922 [SDOI2010]大陆争霸 分层图

    问题描述 幻想历8012年5月12日深夜,斯普林·布拉泽降下神谕:“Trust me, earn eternal life.”克里斯军团士气大增.作为克里斯军团的主帅,你决定利用这一机会发动奇袭,一举 ...

  5. hdu 3499 flight 【分层图】+【Dijkstra】

    <题目链接> 题目大意: 现在给你一些点,这些点之间存在一些有向边,每条边都有对应的边权,有一次机会能够使某条边的边权变为原来的1/2,求从起点到终点的最短距离. 解题分析: 分层图最短路 ...

  6. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  7. Bzoj 2662: [BeiJing wc2012]冻结 dijkstra,堆,分层图,最短路

    2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 647  Solved: 348[Submit][Sta ...

  8. Bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 dijkstra,堆,分层图

    1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1573  Solv ...

  9. HDU 5669 Road(线段树建树)(分层图最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5669 [分析]线段树建树+分层图最短路 #include <cstdio> #includ ...

随机推荐

  1. linux中常用服务的安装

    安装环境:centos7.5 配置离线yum源参考:https://blog.csdn.net/mayh554024289/article/details/54236336vi /etc/yum.co ...

  2. 【Oracle】什么是DRM,怎么关闭

    DRM 分析及案例讲解 什么是DRM DRM(Dynamic Resource management)是oracle10.10.2里面推出来的一个新特性,一直到现在最新的12cR1,都存在,且bug非 ...

  3. kubernets之pod的标签拓展

    一 标签的拓展使用 1.1 标签的作用范围不仅仅适用于pod对node以及其他类的大部分资源同样适用 k label node node01 gpu=true k是kubectl的别名形式 同样对于n ...

  4. 面试时通过volatile关键字,全面展示线程内存模型的能力

    面试时,面试官经常会通过volatile关键字来考核候选人在多线程方面的能力,一旦被问题此类问题,大家可以通过如下的步骤全面这方面的能力.     1 首先通过内存模型说明volatile关键字的作用 ...

  5. Eclipse中给jar包导入JavaDoc的方法

    原文转载自:http://blog.csdn.net/mr_von/article/details/7740138 在使用Java语言开发的过程中,开发人员经常需要用到一些开源的工具包.在使用别人的j ...

  6. linux7下修改主机名的方式

    在基于linux发行版的众多linux kernel 3.0以上,包括rhel7,centos7等提供多种修改linux主机名的方式 1.通过编辑/etc/hostname文件 2.命令hostnam ...

  7. 使用idea插件识别log文件的相关设置

    最近要读一些spring boot项目产生的log文件,众所周知,idea拥有强大的插件系统.当我打开log文件时,idea自动帮我推荐了ideolog这个插件. 但是当我安装好之后发现系统并不能完全 ...

  8. 如何安装快速 Docker 和 Docker-Compose 服务

    最近由于个人在大家基于 Docker  的.企业级的CI/CD 环境,所以要安装 Docker 和 Docker-Compose ,这也算是一个学习过程,就把整个过程记录下来,便于以后查询. 测试环境 ...

  9. 前端面试之HTML5的新变化

    前端面试之HTML5的新变化 H5新增语义化标签 头部标签 <header> :头部标签 <nav> :导航标签 <article> :内容标签 <secti ...

  10. 解析MySQL中存储时间日期类型的选择问题

    解析MySQL中存储时间日期类型的选择问题_Mysql_脚本之家 https://www.jb51.net/article/125715.htm 一般应用中,我们用timestamp,datetime ...