HDU - 6166:Senior Pan(顶点集合最短路&二进制分组)
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.
InputThe 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 x i ,y i  xi,yi
representing an edge, and v i vi
representing its length.1≤x i ,y i xi,yi
≤n,1≤v i 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 a i  ai
, the nodes that Master Dong selects out.1≤a i ai
≤n,a i ai
!=aj  
OutputFor every Test Case, output one integer: the answerSample 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
题意:给定有向图,然后给一个集合,让你在这个集合选一个作为起点,一个作为终点,其最短路最小。
思路:上次做过树上最大收益(边权为花费,顶点有价格,求最大差价),每个点连接汇点,权值为负价;每个点连接源点,权值为正价。然后跑最长路。
此题也是一样的套路,但是起点和终点不能是同一点,所以我们需要分组。
这里分组可以随机20次;也可以用“二进制分组法”。:
举例说明,将1 2 3 4 进行分组,四个数的二进制形式为: 001 010 011 100 
第一次看第0位为1的数,那么A={1,3},B={2,4} 
第一次看第1位为1的数,那么A={2,3},B={1,4} 
第一次看第2位为1的数,那么A={4},B={1,2,3} 
可以看出,任意一对数字,都至少有一次机会不在同一组中。
由于是有向图,还得反过来来一次。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
using namespace std;
const ll inf=;
const int maxn=;
int S,T,Laxt[maxn],Next[maxn];
int in[maxn],To[maxn],Len[maxn],a[maxn],cnt;
ll dis[maxn],ans;
vector<int>G[maxn];
void add(int u,int v,int w){
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; Len[cnt]=w;
}
void SPFA()
{
rep(i,S,T) dis[i]=inf,in[i]=;
dis[S]=; queue<int>q;
q.push(S); in[S]=;
while(!q.empty()){
int u=q.front(); q.pop();
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i]; if(dis[u]+Len[i]<dis[v]) {
dis[v]=dis[u]+Len[i];
if(!in[v]) in[v]=,q.push(v);
}
}
for(int i=;i<G[u].size();i++){
int v=G[u][i]; if(dis[u]<dis[v]) {
dis[v]=dis[u];
if(!in[v]) in[v]=,q.push(v);
}
}
in[u]=;
}
ans=min(ans,dis[T]);
}
int main()
{
int C,Cas=,N,M,tot,u,v,w;
scanf("%d",&C);
while(C--){
scanf("%d%d",&N,&M); T=N+; ans=inf;
rep(j,S,T) Laxt[j]=; cnt=;
rep(i,,M) scanf("%d%d%d",&u,&v,&w),add(u,v,w);
scanf("%d",&tot);
rep(i,,tot) scanf("%d",&a[i]);
rep(i,,){
rep(j,S,T) G[j].clear();
rep(j,,tot)
if(j&(<<i)) G[S].push_back(a[j]);
else G[a[j]].push_back(T);
SPFA();
rep(j,S,T) G[j].clear();
rep(j,,tot)
if(j&(<<i)) G[a[j]].push_back(T);
else G[S].push_back(a[j]);
SPFA();
}
printf("Case #%d: %lld\n",++Cas,ans);
}
return ;
}
HDU - 6166:Senior Pan(顶点集合最短路&二进制分组)的更多相关文章
- HDU 6166 Senior Pan(多校第九场 二进制分组最短路)
		
题意:给出n个点和m条有向边(有向边!!!!我还以为是无向查了半天),然后给出K个点,问这k个点中最近的两点的距离 思路:比赛时以为有询问,就直接丢了,然后这题感觉思路很棒,加入把所有点分成起点和终点 ...
 - hdu 6166 Senior Pan
		
http://acm.hdu.edu.cn/showproblem.php?pid=6166 题意: 给出一张无向图,给定k个特殊点 求这k个特殊点两两之间的最短路 二进制分组 枚举一位二进制位 这一 ...
 - HDU 6166.Senior Pan()-最短路(Dijkstra添加超源点、超汇点)+二进制划分集合 (2017 Multi-University Training Contest - Team 9 1006)
		
学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memor ...
 - HDU 6166 Senior Pan (最短路变形)
		
题目链接 Problem Description Senior Pan fails in his discrete math exam again. So he asks Master ZKC to ...
 - HDU 6166 Senior Pan(二进制分组+最短路)
		
题意 给出一个\(n\)个点\(m\)条边的有向图\((n,m<=100000)\),从中选择\(k\)个点\((k<=n)\),问这k个点两两之间的最短路最小值是多少? 思路 直接的想法 ...
 - HDU 6166 Senior Pan 二进制分组 + 迪杰斯特拉算法
		
Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Probl ...
 - 2017多校第9场 HDU 6166 Senior Pan 堆优化Dij
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6166 题意:给你一个有向图,然后给你k个点,求其中一个点到另一个点的距离的最小值. 解法:枚举二进制位 ...
 - HDU 6166 Senior Pan(k点中最小两点间距离)题解
		
题意:n个点,m条有向边,指定k个点,问你其中最近的两点距离为多少 思路:这题的思路很巧妙,如果我们直接枚举两点做最短路那就要做C(k,2)次.但是我们换个思路,我们把k个点按照二进制每一位的0和1分 ...
 - hdu 6169 Senior PanⅡ Miller_Rabin素数测试+容斥
		
Senior PanⅡ Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Pr ...
 
随机推荐
- 分支语句(switch  case)
			
/switch case 的应用 Console.WriteLine("1.汉堡包"); Console.WriteLine("2.薯条"); Console. ...
 - 使用Angularjs开发Web App 视频课程 --麦子学院课程
			
前往搓这里: http://www.maiziedu.com/group/common/course/3271/ 查看课程搓这里:http://www.maiziedu.com/course/web/ ...
 - zabbix监控php-fpm的性能
			
zabbix监控php-fpm主要是通过nginx配置php-fpm的状态输出页面,在正则取值 要nginx能输出php-fpm的状态必须要先修改php-fpm的配置,这个配置没有开启nginx 就没 ...
 - BeatSaber节奏光剑插件开发官方教程1-创建一个插件模板
			
原文:https://wiki.assistant.moe/modding/intro 一.简介 Beat Saber 开发环境:unity2018.C#..NET framework 4.6. 此教 ...
 - mac下Appium环境配置
			
一.Appium环境搭建 1.xcode(需要OS X版本支持): 下载对应版本的xcode(支持对应手机系统),解压,拖入应用程序. xcode下载地址:https://developer.appl ...
 - web.xml上监听器作用
			
<!--Spring ApplicationContext 载入 --> <listener> <listener-class>org.springframewor ...
 - spring3: 表达式5.2 SpEL基础
			
5.1 概述 5.1.1 概述 Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行 ...
 - javascript HTML DOM 简单介绍
			
JavaScript HTML DOM通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素.HTML DOM (文档对象模型)当网页被加载时,浏览器会创建页面的文档对象模型( ...
 - javascript简单介绍总结(二)
			
JavaScript 函数函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.JavaScript 函数语法函数就是包裹在花括号中的代码块,前面使用了关键词 function:function ...
 - pipenv安装库使用国内镜像
			
pipenv install django超级慢,卡住不动,最后不得不CTRL+C中止 这时有必要改成国内源了,打开Pipfile文件,发现内容是: [[source]] verify_ssl = t ...