题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6166

题意:
给出一个n个点的有向图。然后给你k个点,求这k个点任意两点之间的最短路的最小值。
思路:
以这k个点为起点,维护每个点的最短路和次短路,并且,次短路的祖先不能是本身。

先给几组样例:

5
5 6
1 2 100
2 5 100
5 1 100
3 2 100
2 4 1
4 3 1
2
1 3

5 6
1 2 100
2 5 100
5 1 100
3 2 100
2 4 1
4 3 1
2
1 3

4 5
1 3 1
3 1 1
1 2 1000
2 4 1
4 2 1
2
1 2

3 4
1 2 100
2 3 50
1 3 1
3 1 1
2
1 2

5 6
1 2 1
2 3 3
3 1 3
2 5 1
2 4 2
4 3 1
3
1 3 5

Case #1: 102
Case #1: 102
Case #3: 1000
Case #4: 51
Case #5: 2

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL INF = 1e15;
const int maxn = 1e5 + ;
int T, N, M, k;
queue<int>que;
struct Edge
{
int to, next, len;
Edge() {}
Edge(int to, int next, int len): to(to), next(next), len(len) {}
} E[maxn * ];
int head[maxn], tot;
void initEdge()
{
for(int i = ; i <= N; i++) head[i] = -;
tot = ;
}
void addEdge(int u, int v, int len)
{
E[tot] = Edge(v, head[u], len);
head[u] = tot++;
}
LL dis[maxn][];
int ant[maxn][];
bool in[maxn], qr[maxn];
int main ()
{
int ic = ;
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &N, &M);
initEdge();
for(int i = ; i <= M; i++)
{
int u, v, len;
scanf("%d %d %d", &u, &v, &len);
addEdge(u, v, len);
}
for(int i = ; i <= N; i++)//init
{
dis[i][] = dis[i][] = INF;
ant[i][] = ant[i][] = -;
in[i] = qr[i] = false;
}
queue<int>que;
scanf("%d", &k);
for(int i = ; i <= k; i++)
{
int v;
scanf("%d", &v);
dis[v][] = ;
ant[v][] = v;
que.push(v), qr[v] = in[v] = true;
}
while(!que.empty())
{
int u = que.front();
in[u] = false,que.pop();
for(int k = head[u]; ~k; k = E[k].next)
{
int v = E[k].to;
LL len = (LL)E[k].len + dis[u][];
bool update = false;
if(len < dis[v][])
{
dis[v][] = len;
ant[v][] = ant[u][];
update = true;
}
else if (len < dis[v][] && ant[u][] != v)
{
dis[v][] = len;
ant[v][] = ant[u][];
update = true;
}
len = (LL)E[k].len + dis[u][];
if (len < dis[v][] && ant[u][] != v)
{
dis[v][] = len;
ant[v][] = ant[u][];
update = true;
}
if(update&&!in[v])
{
que.push(v);
in[v] = true;
}
}
}
LL ans = INF;
for(int i=;i<=N;i++)
if(qr[i]) ans = min(ans,dis[i][]);
printf("Case #%d: %lld\n", ++ic, ans);
}
return ;
}

HDU 6166 Spfa的更多相关文章

  1. hdu 6166 Senior Pan

    http://acm.hdu.edu.cn/showproblem.php?pid=6166 题意: 给出一张无向图,给定k个特殊点 求这k个特殊点两两之间的最短路 二进制分组 枚举一位二进制位 这一 ...

  2. 2017多校第9场 HDU 6166 Senior Pan 堆优化Dij

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6166 题意:给你一个有向图,然后给你k个点,求其中一个点到另一个点的距离的最小值. 解法:枚举二进制位 ...

  3. hdu 4568(SPFA预处理+TSP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4568 思路:先用spfa预处理出宝藏与宝藏之间的最短距离,宝藏到边界的最短距离,然后就是经典的求TSP ...

  4. HDU 1317XYZZY spfa+判断正环+链式前向星(感觉不对,但能A)

    XYZZY Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  5. HDU 4568 SPFA + TSP

    这道题是长沙邀请赛的题,当时是道签到题. 这种题还是很常见的,讲一下思路. 首先是预处理出每个宝藏之间的距离,还有到边的距离,直接对每个宝藏进行一次SPFA就可以了. 然后就是经典的求TSP的过程. ...

  6. Key Vertex (hdu 3313 SPFA+DFS 求起点到终点路径上的割点)

    Key Vertex Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tota ...

  7. HDU 1535 SPFA 前向星存图优化

    Invitation Cards Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  8. HDU 1874 SPFA/Dijkstra/Floyd

    这题作为模板题,解法好多... 最近周围的人都在搞图论阿,感觉我好辣鸡,只会跟风学习. 暂时只有SPFA和Dijkstra的 SPFA (邻接表版.也可以写成临接矩阵存图,但题目可能给出平行边的,所以 ...

  9. HDU 6166 Senior Pan (最短路变形)

    题目链接 Problem Description Senior Pan fails in his discrete math exam again. So he asks Master ZKC to ...

随机推荐

  1. [php]手动搭建php开发环境(排错)

    前提:针对自己的系统下载相应的php.apache.mysql,安装完毕后按照以下去配置httpd.conf和php.ini 本人用的是php5.6.4和apache2.4.4 一.Apache : ...

  2. c++刷题(6/100)最长上升子序列

    题目一:区间子数组个数 给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R). 求连续.非空且其中最大元素满足大于等于L 小于等于R的子数组个数. 例如 : 输入: A = ...

  3. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  4. 统计oracle表中字段的个数

    select count(column_name) from user_tab_columns where table_name='emp' dba权限对应的视图是dba_tab_columns 和a ...

  5. Mysql储存过程1: 设置结束符与储存过程创建

    #显示储存过程 show procedure status; #设置结束符 delimiter $; #创建储存过程 create procedure procedure_name() begin - ...

  6. input只读属性 设置和移除 选择数字

    设置只读属性 $('#stage').attr("readonly", "readonly"); 移除 只读属性  $("input").r ...

  7. U3D的一些常用基础脚本

    修改渲染颜色和贴图 1: var texture :Texture ; 2:  3: function Start () { 4: renderer.material.mainTexture = te ...

  8. inux命令英文缩写的含义(方便记忆) 2

    linux常用命令的英文单词缩写 命令缩写: ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户rpm:redhat packa ...

  9. modprobe

    1.1 简介 Linux命令:modprobe .功能说明:自动处理可载入模块.语 法:modprobe [-acdlrtvV][--help][模块文件][符号名称 = 符号值].补充说明:modp ...

  10. strcpy、memcpy和memset之间的区别

    今天刷题时遇到了这个问题,记录一下. strcpy比较简单,就是拷贝字符串,遇到'\0'时结束拷贝. memcpy用来做内存拷贝,可以拷贝任何数据类型的对象并指定拷贝数据的长度:char a[100] ...