题意

给定一个 \(n\) 个点 \(m\) 条边的的有向图,给出 \(k\) 个关键点,求关键点两两最短路的最小值。

\(n\le 10^5, m\le 5\cdot 10^5\).

题解

二进制分组。对于每一位,将编号当前位为 \(0\) 的点做源点/汇点, 当前位为 \(1\) 的点做汇点/源点,然后跑最短路。

复杂度 \(O(n\log ^2 n)\) .

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
namespace io {
const int SIZE=(1<<21)+1;
char ibuf[SIZE],*iS,*iT,c; int qr;
#define gc()(iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,SIZE,stdin),(iS==iT?EOF:*iS++)):*iS++)
inline int gi (){
int x=0;
for(c=gc();c<'0'||c>'9';c=gc());
for(;c<='9'&&c>='0';c=gc()) x=(x<<1)+(x<<3)+(c&15); return x;
}
} using io::gi;
const int N=1e5+5,M=5e5+5;
typedef long long ll;
int head[N],nxt[M],to[M],wei[M],n,m,k,key[N];
#define pr pair<int,int>
priority_queue< pr,vector<pr>,greater<pr> > q;
ll dis[N];
void addedge(int u, int v, int w, int now) {
nxt[now]=head[u], head[u]=now, to[now]=v, wei[now]=w;
}
int main()
{
#ifdef lc
freopen("a.in","r",stdin);
#endif
int T=gi();
while(T--)
{
memset(head,0,sizeof(head));
n=gi(),m=gi(),k=gi();
for(int i=1;i<=m;++i)
{
int u=gi(),v=gi(),w=gi();
addedge(u,v,w,i);
}
for(int i=1;i<=k;++i) key[i]=gi();
ll ans=1ll<<60;
for(int i=0;i<17;++i)
{
memset(dis,0x3f,sizeof(dis));
for(int j=1;j<=k;++j)
if(key[j]&(1<<i))
{
dis[key[j]]=0;
q.push(make_pair(0,key[j]));
}
while(!q.empty())
{
ll tmp=q.top().first;
int u=q.top().second; q.pop();
if(dis[u]!=tmp)continue;
for(int e=head[u];e;e=nxt[e])
if(dis[to[e]]>dis[u]+wei[e])
{
dis[to[e]]=dis[u]+wei[e];
q.push(make_pair(dis[to[e]],to[e]));
}
}
for(int j=1;j<=k;++j) if(!(key[j]&(1<<i))) ans=min(ans,dis[key[j]]);
}
for(int i=0;i<17;++i)
{
memset(dis,0x3f,sizeof(dis));
for(int j=1;j<=k;++j)
if(!(key[j]&(1<<i)))
{
dis[key[j]]=0;
q.push(make_pair(0,key[j]));
}
while(!q.empty())
{
ll tmp=q.top().first;
int u=q.top().second; q.pop();
if(dis[u]!=tmp)continue;
for(int e=head[u];e;e=nxt[e])
if(dis[to[e]]>dis[u]+wei[e])
{
dis[to[e]]=dis[u]+wei[e];
q.push(make_pair(dis[to[e]],to[e]));
}
}
for(int j=1;j<=k;++j) if(key[j]&(1<<i)) ans=min(ans,dis[key[j]]);
}
printf("%lld\n",ans);
}
}

【LOJ3087】「GXOI / GZOI2019」旅行者的更多相关文章

  1. 【LOJ】#3087. 「GXOI / GZOI2019」旅行者

    LOJ#3087. 「GXOI / GZOI2019」旅行者 正着求一遍dij,反着求一遍,然后枚举每条边,从u到v,如果到u最近的点和v能到的最近的点不同,那么可以更新答案 没了 #include ...

  2. LOJ#3087. 「GXOI / GZOI2019」旅行者(最短路)

    题面 传送门 题解 以所有的感兴趣的城市为起点,我们正着和反着各跑一边多源最短路.记\(c_{0/1,i}\)分别表示正图/反图中离\(i\)最近的起点,那么对于每条边\((u,v,w)\),如果\( ...

  3. 「GXOI / GZOI2019」旅行者

    题目 我还是太傻了 考虑每一条边的贡献,对于一条有向边\((u,v,w)\),我们求出\(k\)个关键点中到\(u\)最近的距离\(dis_1\),以及\(v\)到\(k\)个关键点中最近的距离\(d ...

  4. 「GXOI / GZOI2019」简要题解

    「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 ...

  5. LOJ#3083.「GXOI / GZOI2019」与或和_单调栈_拆位

    #3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1 ...

  6. Loj #3085. 「GXOI / GZOI2019」特技飞行

    Loj #3085. 「GXOI / GZOI2019」特技飞行 题目描述 公元 \(9012\) 年,Z 市的航空基地计划举行一场特技飞行表演.表演的场地可以看作一个二维平面直角坐标系,其中横坐标代 ...

  7. 【LOJ】#3088. 「GXOI / GZOI2019」旧词

    LOJ#3088. 「GXOI / GZOI2019」旧词 不懂啊5e4感觉有点小 就是离线询问,在每个x上挂上y的询问 然后树剖,每个节点维护轻儿子中已经被加入的点的个数个数乘上\(dep[u]^{ ...

  8. 【LOJ】#3086. 「GXOI / GZOI2019」逼死强迫症

    LOJ#3086. 「GXOI / GZOI2019」逼死强迫症 这个就是设状态为\(S,j\)表示轮廓线为\(S\),然后用的1×1个数为j 列出矩阵转移 这样会算重两个边相邻的,只要算出斐波那契数 ...

  9. 【LOJ】#3085. 「GXOI / GZOI2019」特技飞行

    LOJ#3085. 「GXOI / GZOI2019」特技飞行 这显然是两道题,求\(C\)是一个曼哈顿转切比雪夫后的线段树扫描线 求\(AB\),对向交换最大化和擦身而过最大化一定分别为最大值和最小 ...

随机推荐

  1. Laravel Vuejs 实战:开发知乎 (5)设计问题表

    1.执行命令: php artisan make:model Models/Question -cm 2.设计问题的数据库迁移文件中的字段: <?php use Illuminate\Datab ...

  2. 网络技能大赛A卷测试

    这个测试对我来言有些难度,短时间内做不了太多.首先是思路的理清,登录后的界面有好几种,而且公文的状态也有好几种.理清思路就花了一些时间 然后大致的框架做了做,然后将用户的增删改查还有公文的增删改查写了 ...

  3. nginx autoindex 配置目录浏览功能

    Nginx打开目录浏览功能 yum install httpd-tools -y cd /usr/local/openrestry/nginx/conf/ htpasswd -c passwd adm ...

  4. Go递归

    1. 递归介绍 package main import ( "fmt" ) func test(n int) { if n > 2 { n-- test(n) } fmt.P ...

  5. 使用dockerfile构建镜像并在容器中安装软件遇到的问题

    今天想在容器中安装一个pigz插件,于是就在dockerfile中使用RUN命令RUN apt-get install -y pigz结果构建镜像的时候报错Unable to locate packa ...

  6. Ubuntu16.04+Ros+Usb_Cam ORB SLAM2

    转载自:https://www.jianshu.com/p/dbf39b9e4617亲测可用 1.其中编译ORB_SLAM2的   ./build.sh 和 ./build_ros.sh之前需要修改文 ...

  7. php将数据写入另外一个文件

    有时候,为了验证PHP的运行过程或者了解代码中的变量的使用情况,需要将变量写到另外一个文件中,方便我们查看.最近也是经常用到file_put_contents这个函数,因为只是试验用,暂时还不需要考虑 ...

  8. js 一句代码 让网页变为编辑器

    document.body.contentEditable = true 只要在控制台执行这行语句   页面就可以自由输入编辑了

  9. js 获取年月日

    虽然网上关于这个的方法很多 但是自己还是总结了一个比较可用的方法 var date=new Date(); var year=date.getFullYear(); ); var day=change ...

  10. JavaScript ES5类 原型 原型链 组合、原型、寄生式继承

    ES5类 原型  原型链 继承 JavaScript中,原型是相对于构造函数(类)的叫法(或者说概念),原型链是相对于构造函数(类)的实例对象的叫法. 对于JavaScript对象,如果在对象自身上找 ...