单源最短路问题拓展


Description

给你一张图,图上有 n 个点,m 条边,要你找到两个点,使其最短路恰好包含给定的 k 个点。输出这条最短路的长度,输入保证有解。

输入格式

第一行两个数 n , m。表示有 n 个点,m 条边。

接下来 m 行每行三个数 xi, yi, vi, 表示有一条长度为vi的双向路径连接对应的两个点。

接下来一个数 k。

接下来一行 k 个数,表示一定要包含的点。

输出格式

一个数,符合要求的最短路长度。

样例输入

样例一

6 6

1 2 2

2 6 2

1 3 1

3 4 1

4 5 1

5 6 1

3

5 1 3

样例二

6 6

1 2 2

2 6 2

1 3 1

3 4 1

4 5 1

5 6 1

2

1 6

样例输出

样例一

3

样例二

4

数据范围:

对于30%的数据,1<=N<=10,1<=M<=20

对于60%的数据,1<=N<=500,1<=M<=1000。

对于100%的数据,1<=N<=100000,1<=M<=300000,1<=vi<=10000,1<=K<=N,保证有解。


题解

我们可以很容易地看出,对于满足要求的这条最短路的两个端点一定是属于要包含的点。因为如果不是,我们可以删掉这个端点,得到的解一定会更优。所以,如果我们找到了这两个端点,就可以很容易地求出答案。

那么我们如何找到这两个端点呢?根据题意,所有需要包含的点均在这条路径上,端点一定是其他点能到达的最远的点。所以我们任取一个包含的点,做一次单源最短路,找到离他最远的那个需要包含的点,这一定是一个端点。

我们再以这个端点做一次单源最短路,即可找到另一个端点。同时,另一个端点到此端点的距离已经求出了。所以一共只用做两遍单源最短路即可得出最后的答案。

代码

#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
#define adde(u,v,w) {e[cnt] = (edge){v,w,head[u]};head[u] = &e[cnt++];} const int maxn = 1e5 + 5, maxm = 3e5 + 5;
const long long inf = 1e12;
int n,m,k;
long long dis[maxn];
int cnt;
int can[maxn];
bool inq[maxn]; queue<int>q; struct edge {
int v;
long long w;
edge *next;
}e[maxm * 2], *head[maxn]; int spfa(int s) {
while(!q.empty())q.pop();
for(int i = 1;i <= n;i++)dis[i] = inf,inq[i] = 0;
dis[s] = 0;
q.push(s);
inq[s] = 1;
while(!q.empty()) {
int u = q.front();q.pop();inq[u] = 0;
for(edge *k = head[u];k;k = k->next) {
if(dis[u] + k->w < dis[k->v]) {
dis[k->v] = dis[u] + k->w;
if(!inq[k->v]) {
inq[k->v] = 1;q.push(k->v);
}
}
}
}
int ans = 0,t = s;
for(int i = 0;i < k;i++)if(dis[can[i]] > ans) ans = dis[can[i]], t = can[i];
return t;
} int main() {
scanf("%d%d",&n,&m);
for(int i = 0;i < m;i++) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
adde(u,v,w);adde(v,u,w);
}
scanf("%d",&k);
for(int i = 0;i < k;i++) {
int x;scanf("%d",&x);can[i] = x;
}
int t = spfa(can[0]);
t = spfa(t);
printf("%lld",dis[t]);
return 0;
}

[10.26_P2] 最短路 (单源最短路应用)的更多相关文章

  1. ACM学习历程——HDU5137 How Many Maos Does the Guanxi Worth(14广州10题)(单源最短路)

    Problem Description    "Guanxi" is a very important word in Chinese. It kind of means &quo ...

  2. 用scheme语言实现SPFA算法(单源最短路)

    最近自己陷入了很长时间的学习和思考之中,突然发现好久没有更新博文了,于是便想更新一篇. 这篇文章是我之前程序设计语言课作业中一段代码,用scheme语言实现单源最段路算法.当时的我,花了一整天时间,学 ...

  3. 【UVA1416】(LA4080) Warfare And Logistics (单源最短路)

    题目: Sample Input4 6 10001 3 21 4 42 1 32 3 33 4 14 2 2Sample Output28 38 题意: 给出n个节点m条无向边的图,每条边权都为正.令 ...

  4. 【算法】单源最短路——Dijkstra

    对于固定起点的最短路算法,我们称之为单源最短路算法.单源最短路算法很多,最常见的就是dijkstra算法. dijkstra主要用的是一种贪心的思想,就是说如果i...s...t...j是最短路,那么 ...

  5. HDU-4849 Wow! Such City! (单源最短路)

    Problem Description Doge, tired of being a popular image on internet, is considering moving to anoth ...

  6. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  7. [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

  8. 单源最短路_SPFA_C++

    当我们需要求一个点到其它所有点的最短路时,我们可以采用SPFA算法 代码特别好写,而且可以有环,但是不能有负权环,时间复杂度是O(α(n)n),n为边数,α(n)为n的反阿克曼函数,一般小于等于4 模 ...

  9. 【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A - Til the Cows Come Home

    https://vjudge.net/contest/66569#problem/A http://blog.csdn.net/wangjian8006/article/details/7871889 ...

随机推荐

  1. CF 977 F. Consecutive Subsequence

    题意: 第一场div3, 求的是一个序列中最长连续(a,a+1,a+2...)子序列. 分析: 设一个DP[i] 表示 序列以i结尾的最长长度, 一开始都设为0. 那么如果这个数是a, 他的最长长度就 ...

  2. C#中如何使用正则表达式

    [草稿版本,谨慎阅读] 参考文档:正则表达式30分钟入门教程 如需系统学习正则表达式内容,请移步上述教程. 正则表达式按照指定的规则来匹配字符或字符串.'.' ' \b' ' \d'等等被称为是正则表 ...

  3. vim 系列

    http://blog.csdn.net/laogaoav/article/details/17370269 非常不错

  4. 基于 WPF + Modern UI 的 公司OA小助手 开发总结

    前言: 距离上一篇博客,整整一个月的时间了.人不能懒下来,必须有个阶段性的总结,算是对我这个阶段的一个反思.人只有在总结的过程中才会发现自己的不足. 公司每天都要在OA系统上上班点击签到,下班点击签退 ...

  5. [luoguP1835] 素数密度_NOI导刊2011提高(04)(素数筛)

    传送门 数据辣么大,怎么搞?(L≤R≤2147483647) 注意到R-L≤1000000 所以可以直接筛R-L区间内的数, 但是需要用已知的小的素数筛, R-L区间内的大部分数肯定能用较小的素数筛去 ...

  6. CodeVs1519 过路费

    题目描述 Description 在某个遥远的国家里,有 n个城市.编号为 1,2,3,…,n.这个国家的政府修建了m 条双向道路,每条道路连接着两个城市.政府规定从城市 S 到城市T需要收取的过路费 ...

  7. BZOJ1742: [Usaco2005 nov]Grazing on the Run 边跑边吃草

    数轴上n<=1000个点,从p出发以任意顺序走到所有的点,求到达每个点的时间之和的最小值. 好题!看起来水水的实际易错! 显然的结论是经过一个区间点之后肯定落在左端点或右端点上,谁没事最后还往中 ...

  8. 进程Queue、线程Queue、堆栈、生产者消费者模型

    没学队列之前,可以用文件实现进程之间通信 但是有2个问题: 1. 速度慢:文件是保存在硬盘空间 2. 为了数据安全要加锁(处理锁是一件很麻烦的事,容易死锁,建议自己轻易不要处理锁) 队列:队列是基于管 ...

  9. Jinja2如何默认将None 值显示为空字符串?

    在Jinja模板中 {% if User %} {{ User.name }} {% endif %} 可以简化为下面的写法,同时,保证返回值为空,而不是显示为“None” {{ User.name ...

  10. Meteor模板

    Meteor模板使用三个顶级标签.前两个是 head 和 body 标签.这些标签和在普通的HTML中做的工作一样.第三个标签 template.这是我们将HTML连接到JavaScript的地方. ...