一开始想的并查集(我一定是脑子坏掉了),晚上听学姐讲题才知道就是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. Dubbo+Zookeeper(二)Dubbo架构

    上次更新博客已经是一年前,这一年发生了很多事,并不顺利,甚至有些痛苦,不过不管怎样,不要停止学习,只有学习才能让你变强,应对更多不安定. 一.RPC概念 Dubbo服务是一个RPC框架,那我们首先就要 ...

  2. Java基础进阶类名整理

    类名综合 数学类: Math:数学运算 BigDecimal:用于精确计算数据 数组工具类: Arrays:数组工具类,用于对数组的操作 时间操作: JDK8以前: Date:表示一个时间,并面向对象 ...

  3. REUSE_ALV_FIELDCATALOG_MERGE函数

    今天使用REUSE_ALV_FIELDCATALOG_MERGE函数,就是获取不到fieldcat, 搞了半天才发现,原来参数要全部大写才行!!小写字符就是获取不到,唉,悲哀...

  4. POJ1629:picnic planning

    题目描述 矮人虽小却喜欢乘坐巨大的轿车,轿车大到可以装下无论多少矮人.某天,N(N≤20)个矮人打算到野外聚餐.为了 集中到聚餐地点,矮人A 有以下两种选择 1)开车到矮人B家中,留下自己的轿车在矮人 ...

  5. 关于Mysql数据库建库字符集utf8mb4下,排序规则utf8mb4_bin和utf8mb4_general_ci选择造成的查询匹配大小写问题

    场景描述: 项目采用了分库模式进行不同业务的开发,在共有的功能模块进行设计的时候采用主从库,或者各分库之中存在同样的库表结构,在使用过程中做库表同步的时候一定要保证库表所在的数据库的字符集和编码格式是 ...

  6. hook笔记①

    汇编中push 0x*** retn表示跳转到某个地址继续执行 取消hook时会在多线程环境中可能被检测 去掉函数框架可以规避寄存器cpu前后状态监测 #pragma comment(linker,& ...

  7. the code has to work especially hard to keep things in the same thread

    django/asgiref: ASGI specification and utilities https://github.com/django/asgiref/

  8. http2 http1 对比

    RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2) https://tools.ietf.org/html/rfc7540#page-4 ...

  9. java 本地方法(JNI)

    最近搞了一个调用第三方so库做登录认证的任务,以前对JNI没什么概念,最近学习了 <java核心技术> 本地方法 一章,把自己写的一些例子记录一下. 自己C语言真是渣渣,所以所有的例子都在 ...

  10. Understanding go.sum and go.mod file in Go

    https://golangbyexample.com/go-mod-sum-module/ Understanding go.sum and go.mod file in Go (Golang) – ...