套路题(然而我没看题解做不出来)

题目大意:给你一个$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】鬼计之夜 最短路+二进制拆分的更多相关文章

  1. 【XSY1162】鬼计之夜 最短路

    题目描述 给你一个\(n\)个点\(m\)条边的有向图,有\(k\)个关键点.求一条最短的从一个关键点到另一个关键点的路径. \(n,m,k\leq 100000\) 题解 跑\(k^2\)次最短路显 ...

  2. 【最短路】【dijkstra】【二进制拆分】hdu6166 Senior Pan

    题意:给你一张带权有向图,问你某个点集中,两两结点之间的最短路的最小值是多少. 其实就是dijkstra,只不过往堆里塞边的时候,要注意塞进去它是从集合中的哪个起始点过来的,然后在更新某个点的答案的时 ...

  3. BZOJ 2069: [POI2004]ZAW(Dijkstra + 二进制拆分)

    题意 给定一个有 \(N\) 个点 \(M\) 条边的无向图, 每条无向边 最多只能经过一次 . 对于边 \((u, v)\) , 从 \(u\) 到 \(v\) 的代价为 \(a\) , 从 \(v ...

  4. hdu 2844 coins(多重背包 二进制拆分法)

    Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...

  5. HDU 4135:Co-prime(容斥+二进制拆分)

    Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  6. 2018.09.08 bzoj1531: [POI2005]Bank notes(二进制拆分优化背包)

    传送门 显然不能直接写多重背包. 这题可以用二进制拆分/单调队列优化(感觉二进制好写). 所谓二进制优化,就是把1~c[i]拆分成20,21,...2t,c[i]−2t+1+1" role= ...

  7. HDU1059 二进制拆分优化多重背包

    /*问你能不能将给出的资源平分成两半,那么我们就以一半为背包,运行多重背包模版 但是注意了,由于个数过大,直接运行会超时,所以要用二进制拆分每种的个数*/ #include<stdio.h> ...

  8. 【找规律】【二进制拆分】hdu6129 Just do it

    给你数列a,问你对它作m次求前缀异或和之后的新数列是什么. 考虑a1对最终生成的数列的每一位的贡献,仅仅考虑奇偶性, 当m为2的幂次的时候,恰好是这样的 2^0 1 1 1 1 1 ... 2^1 1 ...

  9. 【题解】Coins(二进制拆分+bitset)

    [题解]Coins(二进制拆分+bitset) [vj] 俗话说得好,bitset大法吼啊 这道题要不是他多组数据卡死了我复杂度算出来等于九千多万的选手我还不会想这种好办法233 考虑转移的实质是怎样 ...

随机推荐

  1. Warning: Attempt to present A on B whose view is not in the window hierarchy!

    昨天写豆瓣发广播Demo的时候,为了写Demo的简单,就使用了Storyboard,结果执行视图跳转时遇到了这个问题: Warning: Attempt to present <UINaviga ...

  2. 简单的socket编程

    1.socket 服务器搭建 实例化socket服务器,循环获取请求 package com.orange.util; import java.io.IOException; import java. ...

  3. 如何使用css来让图片居中不变形 微信小程序和web端适用

    图片变形很多人祭奠出了妖魔鬼怪般的各种大法,比如使用jq来写,或者使用css表达式来写.今天我总结的是使用css3来写,唯一最大缺点就是对一些浏览器版本不够兼容.下面就是关于如何使用css来让图片居中 ...

  4. php mysql增删查改

    php mysql增删查改代码段 $conn=mysql_connect('localhost','root','root');  //连接数据库代码 mysql_query("set na ...

  5. Go语言的传参和传引用[转]

    目录[-] 传参和传引用的问题 传slice不是传引用! 什么叫传引用? 为什么传slice不是传引用? 为什么很多人误以为slice是传引用呢? 传指针和传引用是等价的吗? 所有类型的函数参数都是传 ...

  6. 红楼梦3d游戏

    1. 红楼梦大观园2d图 2. 红楼梦3d图 潇湘馆 注册机:根据电脑名和时间生成一个id,然后根据注册机生成注册码.

  7. DUBBO配置规则详解

    研究DUBBO也已经大半年了,对它的大部分源码进行了分析,以及对它的内部机制有了比较深入的了解,以及各个模块的实现.DUBBO包含很多内容,如果想了解DUBBO第一步就是启动它,从而可以很好的使用它, ...

  8. iOS应用开发最佳实践

    <iOS应用开发最佳实践> 基本信息 作者: 王浩    出版社:电子工业出版社 ISBN:9787121207679 上架时间:2013-7-22 出版日期:2013 年8月 开本:16 ...

  9. 集合(三)CopyOnWriteArrayList

    第一次见到CopyOnWriteArrayList,是在研究JDBC的时候,每一个数据库的Driver都是维护在一个CopyOnWriteArrayList中的,为了证明这一点,贴两段代码,第一段在c ...

  10. EBS-DBA 维护

    --查询表空间使用率: SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", ...