【Heap-dijkstra】CDOJ1639 云中谁寄锦书来?雁字回时,月满西楼。
题意: 在n个点m条边的无向图上,有k个出口 从起点出发,每到一个点(包括起点),该点连出的边中有d条会被封锁 求最坏情况下到达出口的最短路
题解: 该题为dijkstra算法的拓展
由于求最坏情况下的最短路,对于每个点,显然最优的前d条边不能走
对于边u->v,必然要先得到v到出口的最坏情况下的最短路 才能得到u经过该边再到出口的最坏情况下的最短路,也就是该边对于u的价值 所以要从出口往回考虑
令f[i]表示i到出口的最坏情况下的最短路 同dijkstra算法一样,每个点i可以分为f[i]已确定的和f[i]未确定的 初始时自然是对于每个出口x,f[x]=0已确定
对于f[v]已确定的点v,将边权为w的边u->v以f[v]+w为关键字加入小根堆中
对于每个点i还要记录cnt[i]=k,表示到i后,i连出的最优的前k条边已被封锁
每次取出堆顶对应的边u->v(若f[u]已确定直接弹出) 则该边为u连出的(除已被封锁的边外)最优的边 若cnt[u]<d,该边必然会被封锁,那么将cnt[u]加1,弹出堆顶 若cnt[u]=d,那么可以确定f[u]=f[v]+w,再用u更新连向u的边,弹出堆顶
重复这一过程直到确定f[0]的值,该值即为答案
不妨思考下为何不从起点开始考虑
若从起点开始考虑,令f[i]表示从起点到i的最坏情况下的最短路 对于f[u]已确定的点u,将边权为w的边u->v以f[u]+w为关键字加入小根堆中 每次取出堆顶对应的边u->v(若f[v]已确定直接弹出) 若cnt[u]<d,该边必然会被封锁,那么将cnt[u]加1,弹出堆顶 若cnt[u]=d,可以确定f[v]=f[u]+w,再用v更新v连向的边,弹出堆顶
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct Edge{
int u,v,d;
};
bool operator < (const Edge &a,const Edge &b){
return a.d>b.d;
}
priority_queue<Edge>Heap;
int n,m,K,d,f[100010],cnts[100010];
int v[2000010],__next[2000010],first[100010],w[2000010],e;
void AddEdge(int U,int V,int W){
v[++e]=V;
w[e]=W;
__next[e]=first[U];
first[U]=e;
}
int main(){
int x,y,z;
scanf("%d%d%d%d",&n,&m,&K,&d);
for(int i=1;i<=m;++i){
scanf("%d%d%d",&x,&y,&z);
AddEdge(x,y,z);
AddEdge(y,x,z);
}
memset(f,0x7f,sizeof(f));
for(int i=1;i<=K;++i){
scanf("%d",&x);
f[x]=0;
cnts[x]=d+1;
for(int j=first[x];j;j=__next[j]){
Heap.push((Edge){v[j],x,w[j]});
}
}
while(!Heap.empty()){
Edge E=Heap.top(); Heap.pop();
++cnts[E.u];
if(cnts[E.u]==d+1){
f[E.u]=E.d;
for(int i=first[E.u];i;i=__next[i]){
if(cnts[v[i]]<=d){
Heap.push((Edge){v[i],E.u,f[E.u]+w[i]});
}
}
}
}
printf("%d\n",f[0]>2000000000 ? -1 : f[0]);
return 0;
}
【Heap-dijkstra】CDOJ1639 云中谁寄锦书来?雁字回时,月满西楼。的更多相关文章
- 阿里云鼠标垫,云中谁寄锦书来,阿里云定制GIT指令集鼠标垫
活动地址 云中谁寄锦书来 活动时间 2020.8.19-8.28 奖品 必得,每日200份,共2000份 参考答案 tips:单选选择以上都是,多选就是全选 云效DevOps包含哪些产品- ABCDE ...
- [POJ3463] Sightseeing(次短路 Heap + Dijkstra)
传送门 用dijkstra比较好,spfa可能有的重复 dis[x][2]:dis[x][0]表示起点到x的最短路.dis[x][1]表示起点到x的次短路: tot[x][2]:tot[x][0]表示 ...
- Radix Heap ---Dijkstra算法的优化 BY Gremount
Radix Heap 算法是在Dijkstra的Dial实现的基础上,通过减少对桶的使用,来优化算法的时间复杂度: Dial 时间复杂度是O(m+nC) -------C是最长的链路 Radi ...
- 【 D3.js 高级系列 — 1.0 】 文本的换行
在 SVG 中添加文本是使用 text 元素.但是,这个元素不能够自动换行,超出的部分就显示不出来了,怎么办呢? 高级系列开篇前言 从今天开始写高级系列教程.还是那句话,由于本人实力有限,不一定保证入 ...
- CodeForces 【20C】Dijkstra?
解题思路 heap+Dijkstra就能过.注意边是双向边,要用long long. 附上代码 #include <iostream> #include <queue> #in ...
- HTML第二天学习笔记
今天看视频学习的第一个知识是HTML中的块元素<div>和行内元素<span>. <!doctype html> <html lang="en&qu ...
- poj分类 很好很有层次感。
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ( ...
- 【转】POJ题目分类推荐 (很好很有层次感)
OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期: 一. ...
- 【转】ACM训练计划
[转] POJ推荐50题以及ACM训练方案 -- : 转载自 wade_wang 最终编辑 000lzl POJ 推荐50题 第一类 动态规划(至少6题, 和 必做) 和 (可贪心) (稍难) 第二类 ...
随机推荐
- HTML中设置超链接字体 & 字体颜色
定义链接样式 CSS为一些特殊效果准备了特定的工具,我们称之为“伪类”.其中有几项是我们经常用到的,下面我们就详细介绍一下经常用于定义链接样式的四个伪类,它们分别是: :link :visited : ...
- hdu 1200 To and Fro(简单模拟或DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1200 To and Fro Time Limit: 2000/1000 MS (Java/Others ...
- 【Python学习笔记】Coursera课程《Using Python to Access Web Data》 密歇根大学 Charles Severance——Week6 JSON and the REST Architecture课堂笔记
Coursera课程<Using Python to Access Web Data> 密歇根大学 Week6 JSON and the REST Architecture 13.5 Ja ...
- Javascript正则表达式详细讲解和示例,通俗易懂
正则表达式可以: •测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证 •替换文本.可以在文档中使用一个正则表达式 ...
- Xcode7 iOS9.0 的真机调试
Xcode7的真机调试: 1.Xcode偏好 -> 账号 -> 增加 Apple ID ->显示 free 2.Target 运行 iOS 版本号 3.修正 Team 项 选择 ...
- Python——拼接字符串
Python中可以对字符串进行拼接: 1. 使用字符串拼接运算符: + >>> "Hello" + "World" 'HelloWorld' ...
- 如何消除类型是submit类型的按钮的默认文字 ‘确认提交’
只需要加上value="" 即可.默认的文字就可以去掉了.
- tomcat - gc日志输出
原创 2017年01月04日 14:32:37 2090 tomcat/bin catalina.sh JAVA_OPTS='-server -Xms4g -Xmx4g -Xss256k -XX:Pe ...
- [].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16) })
问问你自己,看得懂这行代码吗?要是看不懂就点击进来看看吧,要是看的懂得话,可以绕路 1.call:call(thisObj,arg1,arg2,arg3) [].forEach.call($$(&qu ...
- 【原创】IIS7.5优化,支持同时10万个请求
背景 IIS7.5是微软推出的最新平台IIS,性能也较以前有很大的提升,但是默认的设置配不适合很大的请求.但是我们可以根据实际的需要进行IIS调整,使其性能更佳,支持同时10万个请求. 以下方案,通过 ...