【xsy1162】鬼计之夜 最短路+二进制拆分
套路题(然而我没看题解做不出来)
题目大意:给你一个$n$个点,$m$条有向边的图。图中有$k$个标记点,求距离最近的标记点间距离。
数据范围:$n,m,k≤10^5$。
设$p_i表$示第$i$个标记点的编号,设$K$为最小正整数,满足$2^K≥k$。
我们在原图中新建点$S$和点$T$,做$2K$次最短路。
对于$K$个二进制位,将$k$个关键点分成两部分,以其中一部分为起点,向另一部分做最短路即可。
时间复杂度:$O(m\ \log\ n\ \log k)$
#include<bits/stdc++.h>
#define M 200005
#define L long long
#define INF (1LL<<60)
using namespace std; struct edge{L u,v,next;}e[M*]={}; L head[M]={},use=;
void add(L x,L y,L z){use++;e[use].u=y;e[use].v=z;e[use].next=head[x];head[x]=use;}
L vis[M]={},S,T,n,m,k; struct node{
L u,dis; node(){u=dis=;}
node(L U,L Dis){u=U; dis=Dis;}
friend bool operator <(node a,node b){return a.dis>b.dis;}
};priority_queue<node> q; L bfs(){
memset(vis,,sizeof(vis));
q.push(node(S,));
while(!q.empty()){
node U=q.top(); q.pop();
if(U.u==T) return U.dis;
if(vis[U.u]) continue;
vis[U.u]=;
for(L i=head[U.u];i;i=e[i].next)
if(vis[e[i].u]==)
q.push(node(e[i].u,U.dis+e[i].v));
}
return INF;
}
L u[M]={},v[M]={},w[M]={},id[M]={};
main(){
scanf("%lld%lld%lld",&n,&m,&k); S=; T=n+;
for(L i=;i<=m;i++) scanf("%lld%lld%lld",u+i,v+i,w+i);
for(L i=;i<=k;i++) scanf("%lld",id+i);
L ans=INF;
for(L p=;p<=k;p<<=){
memset(head,,sizeof(head)); use=;
for(L i=;i<=m;i++) add(u[i],v[i],w[i]);
for(L i=;i<=k;i++)
if(p&i) add(S,id[i],);
else add(id[i],T,);
ans=min(ans,bfs()); memset(head,,sizeof(head)); use=;
for(L i=;i<=m;i++) add(u[i],v[i],w[i]);
for(L i=;i<=k;i++)
if(p&i) add(id[i],T,);
else add(S,id[i],);
ans=min(ans,bfs());
}
cout<<ans<<endl;
}
【xsy1162】鬼计之夜 最短路+二进制拆分的更多相关文章
- 【XSY1162】鬼计之夜 最短路
题目描述 给你一个\(n\)个点\(m\)条边的有向图,有\(k\)个关键点.求一条最短的从一个关键点到另一个关键点的路径. \(n,m,k\leq 100000\) 题解 跑\(k^2\)次最短路显 ...
- 【最短路】【dijkstra】【二进制拆分】hdu6166 Senior Pan
题意:给你一张带权有向图,问你某个点集中,两两结点之间的最短路的最小值是多少. 其实就是dijkstra,只不过往堆里塞边的时候,要注意塞进去它是从集合中的哪个起始点过来的,然后在更新某个点的答案的时 ...
- BZOJ 2069: [POI2004]ZAW(Dijkstra + 二进制拆分)
题意 给定一个有 \(N\) 个点 \(M\) 条边的无向图, 每条无向边 最多只能经过一次 . 对于边 \((u, v)\) , 从 \(u\) 到 \(v\) 的代价为 \(a\) , 从 \(v ...
- hdu 2844 coins(多重背包 二进制拆分法)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- HDU 4135:Co-prime(容斥+二进制拆分)
Co-prime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 2018.09.08 bzoj1531: [POI2005]Bank notes(二进制拆分优化背包)
传送门 显然不能直接写多重背包. 这题可以用二进制拆分/单调队列优化(感觉二进制好写). 所谓二进制优化,就是把1~c[i]拆分成20,21,...2t,c[i]−2t+1+1" role= ...
- HDU1059 二进制拆分优化多重背包
/*问你能不能将给出的资源平分成两半,那么我们就以一半为背包,运行多重背包模版 但是注意了,由于个数过大,直接运行会超时,所以要用二进制拆分每种的个数*/ #include<stdio.h> ...
- 【找规律】【二进制拆分】hdu6129 Just do it
给你数列a,问你对它作m次求前缀异或和之后的新数列是什么. 考虑a1对最终生成的数列的每一位的贡献,仅仅考虑奇偶性, 当m为2的幂次的时候,恰好是这样的 2^0 1 1 1 1 1 ... 2^1 1 ...
- 【题解】Coins(二进制拆分+bitset)
[题解]Coins(二进制拆分+bitset) [vj] 俗话说得好,bitset大法吼啊 这道题要不是他多组数据卡死了我复杂度算出来等于九千多万的选手我还不会想这种好办法233 考虑转移的实质是怎样 ...
随机推荐
- asp.net core 2.1 增加Nlog日志到sql server数据库
一.增加引用 <PackageReference Include="NLog.Extensions.Logging" Version="1.2.1" /& ...
- Microsoft DirectX SDK 2010 版本下载
Microsoft DirectX SDK 2010 版本下载 Version:Date Published:9.29.19626/7/2010File name:File size:DXSDK_Ju ...
- 2018.09.07 bzoj1911: [Apio2010]特别行动队(斜率优化dp)
传送门 斜率优化dp经典题. 题目中说的很清楚,设f[i]表示前i个数分配出的最大值. 那么有: f[i]=max(f[j]+A∗(sum[i]−sum[j])2+B∗(sum[i]−sum[j])+ ...
- 2018.07.08 hdu1394 Minimum Inversion Number(线段树)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- Oracle之SQL语句性能优化(34条优化方法)
(1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处 ...
- 城市边界线预测(根据灯光指数)(PUL)
1.EXEALL.m function EXEALL(FilePath, FileName)%执行所有流程% FilePath: 文件夹所在路径% FileName: 文件夹名称 FullPath = ...
- 添加安全认证的webservice
添加个Key类继承SoapHeader public class KEY : SoapHeader{ public KEY() { // //TODO: 在此处 ...
- 从问题域看hadoop的各种技术
近些年来Hadoop生态系统发展迅猛,它本身包含的软件越来越多,同时带动了周边系统的繁荣发展.尤其是在分布式计算这一领域,系统繁多纷杂,时不时冒出一个系统,号称自己比MapReduce或者Hive高效 ...
- bootstrap 问题
less; sass: css预处理:可以直接使用.css,也可以修改.less,生成定制化的css CDN: 服务,使用这个效果会更好.theme一般不引入,jquery一般在js之前引入. 使用b ...
- The MATLAB Profiler
function a = myFunc(a,b,c,d,e) : a = a-b + c^d*log(e); end end >> profile on; myFunc(a,b,c,d,e ...