题意:

有一张n个点m条边的有向图,还有一个包含k个点的点集,求出这个点集中任意两点间最短路的最小值

官方题解看不懂。。

如果一条边的两个端点都在这个集合中,就将这条边直接删掉(中间记录下最小值)以后不会再用

之后就可以愉快的SPFA了,len[i]表示到i点的最短路

随便设集合中的一个点x1为起点,令len[x1]=0然后求最短路,跑完之后记录所有的len[xi] (xi>1 && xi∈k)看哪个更小,之后再将集合中的第二个点x2的len[]置为0并加入队列,继续spfa,然后记录所有的len[xi] (xi>2 && xi∈k)看哪个更小,如此操作直到集合中所有点的len[]全为0

不过这样只处理了ai到aj (i<j)的最小值,所以还要初始化len[]倒过来再跑一次spfa,操作和上面一样

例如样例k=3,集合中的点为1,3,5

①删掉所有1,3,5之间的边,ans = min(ans, len(u, v))  (e(u, v)∈k)

②求出1号点到所有点的单源最短路,  然后ans = min(ans, len[3], len[5])

③令len[3]=0,将3号点加入队列继续spfa,ans = min(ans, len[5])

④没必要再加最后5号点了,初始化len数组

⑤求出5号点到所有点的单源最短路,  然后ans = min(ans, len[3], len[1])

⑥令len[3]=0,将3号点加入队列继续spfa,ans = min(ans, len[1])

结束,输出ans

看上去貌似是跑了2*k次spfa其实只跑了2次,因为你并没有清空len[]数组,所以只是相当于手动放缩了k次而已

复杂度O((n+m)log(n+m))

#include<stdio.h>
#include<vector>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
#define LL long long
typedef struct
{LL v;LL len;
}Road;
Road now;
vector<Road> G[100005];
queue<LL> q;
LL God[100005], vis[100005], sum[100005];
int main(void)
{LL T, i, n, m, j, x, y, len, k, bet, cas = 1;scanf("%lld", &T);while(T--){scanf("%lld%lld", &n, &m);for(i=1;i<=n;i++)G[i].clear();for(i=1;i<=m;i++){scanf("%lld%lld%lld", &x, &y, &len);now.len = len, now.v = y;G[x].push_back(now);}memset(God, 0, sizeof(God));scanf("%lld", &k);for(i=1;i<=k;i++){scanf("%lld", &x);God[x] = 1;}bet = 100000ll*100000+5;for(i=1;i<=n;i++){if(!God[i])  continue;for(j=0;j<G[i].size();j++){y = G[i][j].v;if(God[y]){bet = min(bet, G[i][j].len);G[i].erase(G[i].begin()+j);j--;}}}memset(vis, 0, sizeof(vis));memset(sum, 62, sizeof(sum));for(i=1;i<=n;i++){if(God[i]){vis[i] = 1;q.push(i);bet = min(bet, sum[i]);sum[i] = 0;while(q.empty()==0){x = q.front();q.pop();vis[x] = 0;for(j=0;j<G[x].size();j++){now = G[x][j];if(sum[x]+now.len<sum[now.v]){sum[now.v] = sum[x]+now.len;if(vis[now.v]==0){vis[now.v] = 1;q.push(now.v);}}}}}}memset(sum, 62, sizeof(sum));for(i=n;i>=1;i--){if(God[i]){vis[i] = 1;q.push(i);bet = min(bet, sum[i]);sum[i] = 0;while(q.empty()==0){x = q.front();q.pop();vis[x] = 0;for(j=0;j<G[x].size();j++){now = G[x][j];if(sum[x]+now.len<sum[now.v]){sum[now.v] = sum[x]+now.len;if(vis[now.v]==0){vis[now.v] = 1;q.push(now.v);}}}}}}printf("Case #%lld: %lld\n", cas++, bet);}return 0;
}

HDU 6166 2017 多校训练:Senior Pan(最短路)相关推荐

  1. HDU 6134 2017 多校训练:Battlestation Operational(莫比乌斯反演+积性函数)

    实在太长了直接放题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6134 这题就是求 考虑当Gcd(i, j)==1时,除了j为1的情况,其它时候i/j一 ...

  2. HDU 6180 2017 多校训练:Schedule

    题意: 和 51nod 1428 活动安排问题 一模一样,只不过还要求一个时间和 http://blog.csdn.net/jaihk662/article/details/77489061 如何求出 ...

  3. HDU 6178 2017 多校训练:Monkeys(DFS)

    题意: 有一棵n个节点的树,树上有k只猴子,这k只猴子所在位置可任意指定,但是每个点上最多只能有一只猴子,现在你要切掉尽可能多的边,但必须保证没有任何一只猴子被完全孤立,求最少得保留多少条边 题目还好 ...

  4. HDU 6162 2017 多校训练:Ch's gift(树链剖分)

    题意: 有一棵n个节点的树,m次查询,每次查询x, y, a, b表示节点x到y的路径上所有在[a, b]范围内的权值和 树链剖分+线段树 询问离线,按a和b分别排序求出所有小于a和所有小于b+1的权 ...

  5. HDU 6170 2017 多校训练:Two strings(DP)

    题意: 给你两个字符串:第一个字符串只包含小写大写字母 第二个字符串除了字母之外,还有'.'和'*',其中'.'可以当成任意一个字符,'*'表示前面那个字符可以重复若干次 当然也可以重复0次,例如a. ...

  6. 2017 多校训练第二场 HDU 6047 Maximum Sequence(贪心+优先队列)

    Maximum Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. (2017多校训练第四场)HDU - 6078 Wavel Sequence dp

    传送门:点击打开链接 定义状态dp[i][j][0]表示以a[i],b[j]结尾的且为波谷的情况总和,dp[i][j][1] 为波峰. 对于某个i,j满足a[i] == b[j],则dp[i][j][ ...

  8. (2017多校训练第一场)HDU - 6034 Balala Power! 贪心

    很容易就想到把每个字母的权重都算出来,然后把权重最大的赋值成25,次大的赋值成24......以此类推. 但是字符串长度最大为100000,也就是说一个字母的权重最大是26^100000次方左右,太大 ...

  9. 2017 多校3 hdu 6061 RXD and functions

    2017 多校3 hdu 6061 RXD and functions(FFT) 题意: 给一个函数\(f(x)=\sum_{i=0}^{n}c_i \cdot x^{i}\) 求\(g(x) = f ...

最新文章

  1. 华谊兄弟出现什么问题_曾经的影视龙头一哥华谊兄弟,为什么如今混得那么惨?...
  2. linux基础概念和个人笔记总结(6)
  3. 深度窥探 QuickTest 视图(1)
  4. 【Python】Pandas中的宝藏函数-apply
  5. java soap envelope_如何在SOAP请求中关闭Envelope和Body
  6. 【渝粤题库】广东开放大学 面向对象方法精粹 形成性考核
  7. 吴恩达作业9:卷积神经网络实现手势数字的识别(基于tensorflow)
  8. c++gdal如何在大图像中截取小图像并获取其图像信息_【图像处理】OpenCV系列十 --- 边缘检测之Canny算子...
  9. 2016-7-3 linux学习笔记
  10. fgui快速接入到一个laya实例项目中
  11. Qt网络编程-简易版TcpClient入门Demo(1)
  12. 有关照度和亮度的单位
  13. roundcube邮箱手机端_用户换了手机号码后,产品该如何应对?
  14. 修改设备管理器信息,修改我的电脑系统属性,修改dxdiag信息
  15. Polar(极坐标)投影--主要用于天气雷达图
  16. 实用frida进阶:内存漫游、hook anywhere、抓包
  17. 岁月温柔-4 最美人间四月天
  18. 粒子群算法求解多元函数最值问题
  19. 截图工具因为计算机无法使用,win7系统电脑自带截图工具不能用失灵了的解决方法...
  20. 计算机停车管理系统界面,智慧停车管理系统-智慧停车整体解决方案

热门文章

  1. python基本代码教程-python基础教程
  2. python编程入门必备知识-Python快速编程入门,打牢基础必须知道的11个知识点
  3. python基础教程pdf-Python基础教程(第3版) PDF高清完整版免费下载|百度云盘
  4. python函数定义及调用-python函数的定义和调用 | 酷python
  5. css入门自学笔记1
  6. json日期格式化 java_java_Java Web程序中利用Spring框架返回JSON格式的日期,返回Json时格式化日期Date 第一 - phpStudy...
  7. cas内外网同时访问_并发编程高手必知——CAS详解
  8. vue使用国密(sm2)
  9. LeetCode 718最长重复子数组
  10. 开源项目管理系统:ProjectForge