hdu 6166 Senior Pan 最短路

HDU6166 Senior Pan 解题报告【图论】【SPFA最短路】【随机】 HDU 6166 阅读详情


Senior Pan

Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 179    Accepted Submission(s): 45


Problem Description
Senior Pan fails in his discrete math exam again. So he asks Master ZKC to give him graph theory problems everyday.
The task is simple : ZKC will give Pan a directed graph every time, and selects some nodes from that graph, you can calculate the minimum distance of every pair of nodes chosen in these nodes and now ZKC only cares about the minimum among them. That is still too hard for poor Pan, so he asks you for help.
 

Input
The first line contains one integer T, represents the number of Test Cases.1≤T≤5.Then T Test Cases, for each Test Cases, the first line contains two integers n,m representing the number of nodes and the number of edges.1≤n,m≤100000
Then m lines follow. Each line contains three integers  xi,yi  representing an edge, and  vi  representing its length.1≤ xi,yi ≤n,1≤ vi ≤100000
Then one line contains one integer K, the number of nodes that Master Dong selects out.1≤K≤n
The following line contains K unique integers  ai , the nodes that Master Dong selects out.1≤ ai ≤n, ai !=aj
 

Output
For every Test Case, output one integer: the answer
 

Sample Input
  
1 5 6 1 2 1 2 3 3 3 1 3 2 5 1 2 4 2 4 3 1 3 1 3 5
 

Sample Output
  
Case #1: 2
 

Source
 

Recommend
liuyiding   |   We have carefully selected several similar problems for you:   6170  6169  6168  6167  6166 
 

Statistic |  Submit |  Discuss |  Note
题意:给你一个有向图,然后给你k个点,求其中一个点到另一个点的距离的最小值。

思路:恩。。。官方题解说的有点不清楚,搞得我斟酌了好一会大概知道他想说什么了。。首先一个集合到另一个集合的最短路径是可以一遍dijkstra算出来的。这个如果想不通最短路没过关。然后任意两个点在二进制表示上肯定至少有一位是不相同的,所以只要枚举二进制的位数,把k个点分成两个集合,跑logn次dijkstra就能把全部情况跑出来。。大概就这样,想通了的话代码是很好写的。下面给代码:

#pragma comment(linker, "/STACK:102400000,102400000") 
#include<iostream>  
#include<cmath>  
#include<queue>  
#include<cstdio>  
#include<queue>  
#include<algorithm>  
#include<cstring>  
#include<string>  
#include<utility>
#include<set>
#include<map>
#include<stack>
#include<vector>
#define maxn 100005
#define inf  0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long LL;
const double eps = 1e-5;
const int mod = 1e9+7;
struct Edge{
	int v, val,next;
}p[maxn];
struct node{
	int x;
	LL step;
};
int head[maxn], len, a[maxn], mark[maxn];
LL vis[maxn];
priority_queue<node>q;
bool operator<(node a, node b){
	return a.step > b.step;
}
void addedge(int u, int v,int val){
	p[len].v = v;
	p[len].val = val;
	p[len].next = head[u];
	head[u] = len++;
}
LL dijkstra(){
	while (!q.empty()){
		node now = q.top();
		q.pop();
		if (mark[now.x])
			return now.step;
		for (int i = head[now.x]; ~i; i = p[i].next){
			int next = p[i].v;
			if (vis[next] > now.step + p[i].val){
				vis[next] = now.step + p[i].val;
				q.push(node{ next, vis[next] });
			}
		}
	}
	return inf;
}
void init(){
	memset(vis, inf, sizeof(vis));
	memset(mark, 0, sizeof(mark));
	while (!q.empty())
		q.pop();
}
LL solve(int k){
	LL ans = inf;
	for (int i = 0; i < 20; i++){
		init();
		for (int j = 0; j < k; j++){
			if (a[j] & (1 << i)){
				q.push(node{ a[j], 0 });
				vis[a[j]] = 0;
			}
			else
				mark[a[j]] = 1;
		}
		ans = min(ans, dijkstra());
		init();
		for (int j = 0; j < k; j++){
			if (a[j] & (1 << i))
				mark[a[j]] = 1;
			else{
				q.push(node{ a[j], 0 });
				vis[a[j]] = 0;
			}	
		}
		ans = min(ans, dijkstra());
	}
	return ans;
}
int main(){
	int t;
	scanf("%d", &t);
	for (int tcase = 1; tcase <= t;tcase++){
		memset(head, -1, sizeof(head));
		len = 0;
		int n, m;
		scanf("%d%d", &n, &m);
		while (m--){
			int u, v, w;
			scanf("%d%d%d", &u, &v, &w);
			addedge(u, v, w);
		}
		int k;
		scanf("%d", &k);
		for (int i = 0; i < k; i++)
			scanf("%d", &a[i]);
		printf("Case #%d: %lld\n", tcase, solve(k));
	}
}


Win10 + Linux 双系统删除(Linux) 删除Linux所使用的磁盘分区 进入此电脑->计算机->管理->磁盘管理 阅读详情

相关推荐

STM32使用内部RC振荡器作为系统时钟开发项目--内晶振启动模板工程

STM32使用内部RC振荡器时,OSC32_IN,OSC32_OUT接法: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法:    2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。    2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出

overflyme的博客 1万+

hdu6166-最短路&二进制枚举-Senior Pan

http://acm.hdu.edu.cn/showproblem.php?pid=6166 给定一个有向图,再给你一个集合。问这些集合中 两个点之间相互的最短路距离最小是多少。 思路:集合中每个数二进制都有一位不相同, 所以通过枚举二进制可以保证 包含了所有 两两枚举的情况。 然后dij的思路 就是通过 贪心+集合+有限的松弛操作 来搞事情的。 所以也可以计算集合之间的最短路,(学了一招

天与云与山与水 398

算法策略 | MACD跨周期短线交易策略开发(股指+商品双版)

量化策略开发,高质量社群,交易思路分享等相关内容

松鼠宽客的博客 2539

hdu6166 最短路

传送门 题意:在一个有向图中,选出K个点,问任意两个点的最短距离中 最小的那个是多少。 因为K太大了,不能枚举任意两个点的距离,所以需要一些技巧,分组!,将所有点分成两组,设为A,B组,那么我们用优先队列求解,初始把所有A组点加入队列,以远离初始点距离最短的优先,A组中所有点一旦走到B组任意一个点,便找到了从A组到B组的一条最短路,我们要做的关键地方是分组,如何使得任意两个点都有一次机会不在同一

猿的进化 649

# 执行 DISM 命令时出错 87 未在此上下文中识别出 restorehealth 选项。解决方法

# 执行 DISM 命令时出错 87 未在此上下文中识别出 restorehealth 选项。解决方法

段子手168的博客 1万+

matlab特征提取和分类_SAST Weekly|MATLAB机器学习初探——做个心音分类器

SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普、研究前沿热点介绍、科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享知识的同学投稿至 eesast@mail.tsinghua.edu.cn , 期待你的作品!本期的SAST weekly,想跟大家分享一下如何用MATLAB进行初步的机器学习,构建一个正常/...

weixin_36453829的博客 5579

HDU - 6166

题目链接:HDU - 6166 显然,如果我们把K个点可以分成两组,那么我们直接最短路就可以求出一组到另一组之间的最短路。 所以我们怎么分组才能尽量少的分组,使得任意两点一定会某一时刻存在不同集合呢?二进制分组。只需要分组log次。 然后因为是,有向图,分组的两种情况都需要跑一次最短路。 这个是稀疏图,spfa会比Dijkstra快很多。 AC代码: #pragma GCC optimize(...

青烟绕指柔的博客 634

【嵌入式 – GD32开发实战指南(ARM版本)】第1部分 基础篇 - 第1章 开发环境搭建

开发环境: MDK:Keil 5.30 MCU:GD32F207IK 1.1 GD32F207I-EVAL开发板简介 笔者使用的开发板是兆易创新设计的GD32F207I-EVAL开发板。 GD32F207I-EVAL开发板使用 GD32F207IK作为主控制器,主频120MHz、集成3MB Flash、256KB SRAM、通用定时器*10、Adv. TM*2、Basic TM*2、系统时钟*1、看门狗*2、RTC*1、USART*4、UART*4、I2C*3、SPI*3、I2S*1、SDIO*1、CAN

不问归期的博客 9986

【题解】HDU6166:Senior Pan

原题传送门 这是一种

ModestCoder_的博客 419

Airtest进阶使用篇-提高脚本稳定性+批量运行脚本

Airtest进阶篇,主要分享如何提高脚本稳定性+如何批量运行脚本生成测试报告!

程序员小杨哥的博客 2569

如何使用rdma-core来实现RDMA操作

rdma-core 是一个开源项目,为远程直接内存访问(RDMA)提供用户空间的支持。它包括 RDMA 设备的驱动程序、库和工具,旨在简化 RDMA 应用的开发和部署。

嵌入式技术开发 3896

hdu 6166 Senior Pan

http://acm.hdu.edu.cn/showproblem.php?pid=6166 题意: 给出一张无向图,给定k个特殊点 求这k个特殊点两两之间的最短路 二进制分组 枚举一位二进制位 这一位为1的放到起点集合 这一位为0的放到终点集合 跑一遍两个集合间的最短路 因为是有向图,反过来再跑一遍 正确性分析: 设最优解是x和y间的最短路 若x和y被分...

weixin_34293141的博客 154

079、镜头阴影校正(LSC)精讲:径向衰减模型、增益矩阵生成与产线标定技巧

《镜头阴影校正(LSC)实战精要》 本文从实际案例出发,深入解析镜头阴影校正的核心技术与产线应用。作者通过一个典型故障案例(0.05mm镜片偏移导致LSC失效)揭示了LSC不仅是数学问题,更是光学-机械-工艺耦合系统。 【关键技术点】 模型优化:提出"径向+切向"双分量模型替代传统cos⁴θ模型,采用5阶多项式拟合径向衰减,1阶线性补偿切向误差 增益矩阵生成:采用自适应网格技术,在边缘区域加密网格,结合中值滤波与高斯平滑消除噪声干扰 产线标定:强调光源均匀性校准(积分球vs平板光源)、坏点预处理、温度补偿等

zzfmlxs的博客 102

hdu 6166 Senior Pan(最短路)

Senior Pan Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 272    Accepted Submission(s): 80 Problem Description Senior Pan fail

MR CODER 775

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

HDU 6166 Senior Pan 【二进制分组,最短路】

题目链接 题意 给出一张有向图,求其中 KKK 个点之间的最短路 显然求 KKK 次最短路会超时,可以换个角度思考。把KKK个点分成两个集合,同一集合内的点互相距离为0,最短路也就是这两个点集之间的最短路(最短路的两个端点不在同一个集合内)。 现在只需要考虑这个集合需要分多少次。从二进制的角度看,把集合KKK 中第 iii 位为 0 和为 1 的分为两个集合,这样对于无论最短路端点是哪两个,从第1位拆到第log(n)+1log(n)+1log(n)+1位,一定有一次会把他们拆到不同的集合。 每次对于两个集

qq_50554695的博客 304

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Senior Pan HDU - 6166 (两个集合的最短路)

Senior Pan HDU - 6166 Senior Pan fails in his discrete math exam again. So he asks Master ZKC to give him graph theory problems everyday. The task is simple : ZKC will give Pan a directed graph e...

nucleare的博客 268

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[hdu6166]Senior Pan——顶点集合最短路+二进制划分

题目大意: 给定一个有向图和一个顶点的集合,求这些顶点两两构成的最短路的最小值。 思路: 考虑把这个集合给随机划分,最后的答案s->t有很大概率被划分到了两个不同的集合。 正解为二进制划分。 何谓二进制划分?即对于集合中的物品编号,之后枚举其二进制下的每一位,对于每一位,都作一次划分:这一位为1的放入一个集合,这一位为0的放入一个集合。 考虑这样的正确性,两个不同的物品的编号二进制...

aizhuji9626的博客 208

HDU 6166 Senior Pan(思维 最短路)

题目:点击打开链接 题意:给一个有向图,n个点,m条边。给k个其中的点,求这k个点相互之间的路径值的最小值是多少。 思路:如果是暴力枚举这k个点到其他k-1个点的最短路取最小值一定是超时的。 正确做法是每次将k个点划分成两个集合,求这两个集合的最短路,取最小值。划分的方法应该保证这k个点均相互求过最短路,且划分次数不应太多以免超时。 这道题最难想到的是对这k个点进行划分,这里方法是这样的:

Code change the World. 407

hdu6166—Senior Pan(二进制划分跑最短路)

题目链接:传送门 Senior Pan Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 381    Accepted Submission(s): 138 Problem Description

zhiyuanjiang的博客 435

Senior Pan HDU - 6166 最短路+思维

题目链接https://vjudge.net/problem/HDU-6166参考http://blog.youkuaiyun.com/qq_33362864/article/details/77494173题意:给一个有向图,n个点,m条边。给k个其中的点,求这k个点相互之间的路径值的最小值是多少。这道题最难想到的是对这k个点进行划分,这里方法是这样的:将这k个点用二进制来划分。首先两个不相同的数,其二进制一

now_ing的博客 1064

HDU 6166 Senior Pan (最短路变形)

题目链接 Problem Description Senior Pan fails in his discrete math exam again. So he asks Master ZKC to give him graph theory problems everyday.The task is simple : ZKC will give Pan a directed gra...

185

HDU 6166 Senior Pan 【二进制分组最短路 】 好题

传送门 //题意: n个点m条边的有向图, 给出询问的k个点, 问这k个点中最短路径是多少. //思路: 有个最明显的思路就是加一个超级源点S和超级汇点T, 然后连接询问的那些点, 然后跑一遍最短路即可, 问题就是万一同时连接到了一个点, 那怎么算最短路了, 我们可以知道这些点可以分为两个集合, 一个是起点集合, 一个是终点集合, 而我们的目的就是把正确的点放在相应的集合中, 这样答案一定就可

Anxdada -- 我等风来也等你 1076

HDU 6166 Senior Pan spfa(顶点集间最短路)

传送门:HDU6166 题意:给出一个有向图,并给出一个点集,请求出集合中的点任意两两之间的最短距离中最小的那个。 思路:当时xjb写了一发二分 + 爆搜,果不其然TLE。。 正解:戳这里戳这里 按照二进制位分组的思路真的是很巧妙啊。 代码: #include #define ll long long #define inf 0x3f3f3f3f using namespace std

WA是一笔财富 332

【二进制划分集合 最短路】HDU6166 Senior Pan

想通了就很神奇k个点,可以分为2个集合s1,s2 显然dijkstra一遍即可得到s1到s2的最小距离考虑枚举2进制的每一位 若第i位=1,则分进s1,否则分进s2 显然所有不同的pair组合都被包含了

Starry_starry_night的博客 668

Senior Pan HDU - 6166 (最短路咯)

Senior Pan fails in his discrete math exam again. So he asks Master ZKC to give him graph theory problems everyday. The task is simple : ZKC will give Pan a directed graph every time, and selects som

Coldfresh的博客 633

HDU 6166 Senior Pan (最短路 好题)

题意:给你一个n个点m条边的有向带边权的图。现在给你k个点,问k个点中最近的点对距离。 n, m, k 思路:这题的思路好强啊。。。任意两个点在二进制表示上肯定至少有一位是不相同的,所以我们可以枚举二进制的 位数,每次把k个点中二进制某一位为1的分一个集合,为0的分一个集合,做一次最短路,找到这两个集合之间的最 短路。枚举所有二进制的位数后,这样就包含了所有点对的最短路。(求集合与

CillyB的博客 535
上一篇: hdu 6148 Valley Numer 数位dp
下一篇: hdu 6171 Admiral 双向bfs+hash
overload1997
博客等级 码龄11年 328粉丝 210原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值