云中谁寄锦书来?雁字回时,月满西楼。

Time Limit: 6000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)

Submit  Status
在干完 TheBigOne(一票大的)之后,劫犯们得准备逃跑路线了。

城市可以看作 n 个点 m 条边的无向图,节点编号为 0 到 n−1,其中有 k 个点为安全屋,劫犯们只要到达其中一个安全屋就能摆脱警察的追捕。

劫犯们从联合储蓄(节点 0)出发,希望能在最短的时间内到达安全屋。

但是警察对劫犯紧追不舍,每当劫犯到达一个节点,警察就立刻封锁与该点相连的边。

由于警力有限,对于当前点警察最多能够封锁与其相连的 d 条边。

现在劫犯想知道,在最坏情况下,他们能到达安全屋的最短时间。

Input

第一行四个整数 n 、m 、k 和 d,含义如上文所描述。
接下来 m 行每行三个整数 u 、v 和 w,表示节点 u 和 v 之间有一条边,且通过该条边要花费 w 的时间。

接下来一行有 k 个整数,表示安全屋所在节点编号。

1≤n≤100000,1≤m≤1000000,0≤k≤n,0≤d≤m,0≤u 、v<n,0≤w≤10000 。

Output

若劫犯们不能到达安全屋,则输出 −1 。

否则输出最坏情况下劫犯们到达安全屋的最短时间。

Sample input and output
Sample Input Sample Output
3 3 1 0                            2
0 1 1
1 2 1
0 2 3

2

3 3 1 1                           -1
0 1 1
1 2 1

0 2 3

2

Source

2017 UESTC Training for Graph Theory

UESTC 1639 云中谁寄锦书来?雁字回时,月满西楼。

My Solution

题意:在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]的值,该值即为答案。
时间复杂度 O(nlogn)
空间复杂度 O(n)

#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
typedef long long LL;
typedef pair<int, int> ii;
const int MAXN = 1e5 + 8;
const int MAXM = 1e6 + 8;
const int INF = 2e9 + 8;
vector<ii> sons[MAXN];
int dis[MAXN];
int cnt[MAXN];
bool vis[MAXN];
priority_queue<ii, vector<ii>, greater<ii> > pq;
//O(nlogn)
inline void ex_dijkstra(int n, int d)
{memset(vis, false, sizeof vis);int u, v, w, dist, sz, i;while(!pq.empty()){u = pq.top().second;dist = pq.top().first;pq.pop();if(vis[u]) continue;else{if(cnt[u] == d){dis[u] = dist;vis[u] = true;}else{cnt[u]++;continue;}}sz = sons[u].size();for(i = 0; i < sz; i++){v = sons[u][i].first;w = sons[u][i].second;if(dist + w < dis[v]){//dis[v] = d + w;pq.push(ii(dist + w, v));}}}
}
int main()
{#ifdef LOCALfreopen("f.txt", "r", stdin);//freopen("f.out", "w", stdout);int T = 4;while(T--){#endif // LOCALios::sync_with_stdio(false); cin.tie(0);int n, m, k, d, i, u, v, w;//cin >> n;scanf("%d%d%d%d", &n, &m, &k, &d);for(i = 0; i < m; i++){scanf("%d%d%d", &u, &v, &w);sons[u].push_back(ii(v, (int)w));sons[v].push_back(ii(u, (int)w));}for(int i = 0; i <= n; i++){dis[i] = INF;}for(i = 0; i < k; i++){scanf("%d", &u);dis[u] = 0;cnt[u] = d;pq.push(ii(0, u));}ex_dijkstra(n, d);if(dis[0] == INF) puts("-1");else printf("%d\n", dis[0]);#ifdef LOCALwhile(!pq.empty()) pq.pop();memset(cnt, 0, sizeof cnt);for(i = 0; i <= n; i++) sons[i].clear();cout << endl;}#endif // LOCALreturn 0;
}

Thank you!

------from ProLights

UESTC 1639 云中谁寄锦书来?雁字回时,月满西楼。 Dijkstra拓展相关推荐

  1. 云效上线“云中谁寄锦书来”云端专属密码情书

    30行代码可以做什么?!!! 答案是可以制作一封云端专属密码情书. 都说程序员闷骚.不懂浪漫,程序员真正浪漫起来,又是怎样的呢? 上周,云效上线了"云中谁寄锦书"来的云端定制密码情 ...

  2. 谁说程序员不浪漫,那是你没有深入了解他们,云效上线“云中谁寄锦书来”云端专属密码情书

    30行代码可以做什么?!!! 答案是可以制作一封云端专属密码情书. 都说程序员闷骚.不懂浪漫,程序员真正浪漫起来,又是怎样的呢? 上周,云效上线了"云中谁寄锦书"来的云端定制密码情 ...

  3. 【Heap-dijkstra】CDOJ1639 云中谁寄锦书来?雁字回时,月满西楼。

    题意: 在n个点m条边的无向图上,有k个出口 从起点出发,每到一个点(包括起点),该点连出的边中有d条会被封锁 求最坏情况下到达出口的最短路 题解: 该题为dijkstra算法的拓展 由于求最坏情况下 ...

  4. UESTC 914 方老师的分身I Dijkstra

    题意:求有向图的往返最短路的最长长度. 分析:求第一次到所有点的距离可以用一次Dijkstra求最短路求出来.考虑回来的路,想想就知道,从每个点回来的路即为将边的方向反转再求一次最短路后的结果. 所以 ...

  5. 云中谁寄锦书来,盛大也!

    今天中午,盛大公布了万众瞩目的锦书(Bambook)的最终售价--999元!这个价格让总算没有辜负Michael对其的喜爱,于是第一时间到锦书的官网上排队预订,凑个热闹,排到了第1328位.就在完成支 ...

  6. js template换行_D3.js实现文本的换行详解

    一.文字换行是什么问题? 现有一字符串: var str = "云中谁寄锦书来,雁字回时,月满西楼"; 李清照的一剪梅,读过吗? 在 body里添加一个 svg元素,大小如下: v ...

  7. 一起回味肝肠寸断的古人情诗

    [b]1.<蒹葭>[/b] <蒹葭>是一首哀婉的恋歌."蒹葭苍苍,白露为霜.所谓伊人,在水一方.溯洄从之,道阻且长:溯游从之,宛在水中央."作者的心上人可望 ...

  8. html注释的爱情故事,才女李清照的爱情故事:才下眉头,却上心头

    引导语:因李清照的丈夫赵明诚的离世,李清照的晚年在"寻寻觅觅.冷冷清清"的中度过,那么大家与小编一起了解关于她的爱情故事吧. 文章地址:https://www.llysc.cn/c ...

  9. 无向图的最短路径求解算法之——Dijkstra算法

    在准备ACM比赛的过程中,研究了图论中一些算法.首先研究的便是最短路的问题.<离散数学>第四版(清华大学出版社)一书中讲解的Dijkstra算法是我首先研究的源材料. 如何求图中V0到V5 ...

  10. 云通信的变迁史:从飞鸽传书到即时可达

    云通信行业开始迎来繁荣大发展,似乎已然成为了所有人的共识.在"信息就是生命"的时代,与信息相关的任何话题,都能轻松成为关注的焦点. 当互联网的发展让来自企业侧的沟通需求急剧上升.越 ...

最新文章

  1. 访问SharePoint站点时,提示:Service Unavailable
  2. VMTK学习——01.入门
  3. JavaWeb编程(十)Json语句
  4. C++手册_迅为干货 | C程序调用shell
  5. 台湾国立大学郭彦甫Matlab教程笔记(2)
  6. 文件上传 upload-labs 1~20做题记录
  7. mac 大写锁定延迟_延迟分析中的案例研究:锁定与同步
  8. php正则替换p闭合标签,php正则替换标签的实现方法
  9. C语言-数组a 和a 的区别
  10. java获取两张图片的相似度
  11. 数据库每日一题 2020.04.30
  12. error: unpacking of archive failed on file错误的解决
  13. oracle minus intersect,minus,oracle中INTERSECTMINUS用法
  14. meltdown linux检测,Spectre ampamp; Meltdown漏洞检测工具
  15. windows11 scp
  16. JLINK V8更新固件
  17. liu四声拼音怎么读_刘的拼音怎么读
  18. 贴片元件的封装中名字后缀的L、N、M的含义
  19. 深度解决 SecurityException: User has not given permission to device UsbDevice
  20. 【JAVA】逢三退一的第二种思路(面向对象)

热门文章

  1. c++中rand(),srand()使用
  2. 系统坏了用u盘怎么重装系统
  3. 如何给拍好的短视频配音?最简单的方法推荐!
  4. c#禁止任务管理器关闭任务
  5. 在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?
  6. 模拟赛DAY 2 T2不老梦
  7. 计算机基础知识(免费、全面)
  8. 基于ssm与maven,使用easyui--tree生成类似部门管理树形结构图
  9. Excel 预习阶段Day1
  10. 日期时间对象date 定时器 格林威治时间