正题

题目链接:https://www.luogu.com.cn/problem/P5304


题目大意

nnn个点mmm条边的一张有向图,有kkk个关键点,求距离最短的一对关键点。


解题思路

我们能够O(nlog⁡n)O(n\log n)O(nlogn)的进行一个起点或多个起点同时的最短路,但是这题显然不能枚举其中的一对点。

可以考虑多个起点的最短路做法,我们可以做到每次计算一组点到另一组点之间的最短路,考虑如何分组能够让每一队都分到过不同的组。

我们可以枚举一个位数iii,对于第xxx个关键点,如果xxx的第iii位为111那么久分入第一个点组,否则分入第二个点组,那么这样分组就可以做到每个点对都分到过不同的组。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const ll N=1e5+10;
struct edge_node{ll x,y,w;
}e[N*5];
struct node{ll to,next,w;
}a[N*7];
struct point{ll pos,dis;bool operator<(const point &x)const{return x.dis<dis;}
};
priority_queue<point> q;
ll T,n,m,k,tot,ans,s,t;
ll z[N],ls[N],f[N];
bool v[N];
void addl(ll x,ll y,ll w){a[++tot].to=y;a[tot].next=ls[x];a[tot].w=w;ls[x]=tot;
}
void Dij(){memset(f,0x3f,sizeof(f));memset(v,0,sizeof(v));q.push((point){s,0});f[s]=0;while(!q.empty()){ll x=q.top().pos,w=q.top().dis;q.pop();if(v[x])continue;v[x]=1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(f[x]+a[i].w<f[y]){f[y]=f[x]+a[i].w;if(!v[y])q.push((point){y,f[y]});}}}return;
}
int main()
{scanf("%lld",&T);while(T--){scanf("%lld%lld%lld",&n,&m,&k);s=0;t=n+1;ans=1e18;for(ll i=1;i<=m;i++)scanf("%lld%lld%lld",&e[i].x,&e[i].y,&e[i].w);for(ll i=1;i<=k;i++)scanf("%lld",&z[i]);for(ll p=0;(1<<p)<=k;p++){tot=0;memset(ls,0,sizeof(ls));for(ll i=1;i<=m;i++)addl(e[i].x,e[i].y,e[i].w);for(ll i=1;i<=k;i++)if((i>>p)&1)addl(s,z[i],0);else addl(z[i],t,0);Dij();ans=min(ans,f[t]);tot=0;memset(ls,0,sizeof(ls));for(ll i=1;i<=m;i++)addl(e[i].x,e[i].y,e[i].w);for(ll i=1;i<=k;i++)if((i>>p)&1)addl(z[i],t,0);else addl(s,z[i],0);Dij();ans=min(ans,f[t]);}printf("%lld\n",ans);}
}

P5304-[GXOI/GZOI2019]旅行者【最短路】相关推荐

  1. luogu P5304 [GXOI/GZOI2019]旅行者

    传送门 所以这个\(5s\)是SMG 暴力是枚举每一个点跑最短路,然后有一个很拿衣服幼稚的想法,就是把所有给出的关键点当出发点,都丢到队列里,求最短路的时候如果当前点\(x\)某个相邻的点\(y\)是 ...

  2. GXOI/GZOI2019题解

    GXOI/GZOI2019题解 P5300 [GXOI/GZOI2019]与或和 一眼题.. 显然枚举每个二进制位,答案就变成了全1子矩阵数量. 这个xjb推推,单调栈一下就行了. #include& ...

  3. [GXOI/GZOI2019]旧词——树链剖分+线段树

    题目链接: [GXOI/GZOI2019]旧词 对于$k=1$的情况,可以参见[LNOI2014]LCA,将询问离线然后从$1$号点开始对这个点到根的路径链修改,每次询问就是对询问点到根路径链查询即可 ...

  4. [数据结构专训][GXOI/GZOI2019]旧词,[hdu5118]GRE Words Once More!,[hdu6333]Problem B. Harvest of Apples

    文章目录 T1:[GXOI/GZOI2019]旧词 solution code T2:GRE Words Once More! solution code T3:Problem B. Harvest ...

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

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

  6. 【题解】Luogu-P5303 [GXOI/GZOI2019]逼死强迫症

    P5303 [GXOI/GZOI2019]逼死强迫症 Preface 矩阵题的登峰造极之作. Description 有 TTT 组数据. 对于每组数据,给定正整数 NNN,请求出用 (N−1)(N- ...

  7. 【详●析】[GXOI/GZOI2019]逼死强迫症

    [详●析][GXOI/GZOI2019]逼死强迫症 脑子不够用了... [题目大意] 在\(2\times N\)的方格中用\(N-1\)块\(2\times 1\)的方砖和\(2\)块\(1\tim ...

  8. P5303 [GXOI/GZOI2019]逼死强迫症 题解

    P5303 [GXOI/GZOI2019]逼死强迫症 P5303 [GXOI/GZOI2019]逼死强迫症 说实在的这题不难,但是我推 Dp\tt DpDp 的时候却只和正解相差一点,最后还是看了题解 ...

  9. Luogu3350 ZJOI2016 旅行者 最短路、分治

    传送门 题意:给出一个$N \times M$的网格图,边有边权,$Q$组询问,每组询问$(x_1,y_1)$到$(x_2,y_2)$的最短路.$N \times M \leq 2 \times 10 ...

最新文章

  1. android socket 收不到数据,android Socket服务端接收客户端数据问题
  2. spring系统学习:20180611: Spring中AOP通知的类型
  3. MySQL子查询嵌套查询
  4. (转载)HTTP与RPC的区别
  5. 华为鸿蒙战略大会,华为发布鸿蒙2.0手机版的三大战略意义,全场景万物互联只是其一...
  6. php 赋予变量现在时间,PHP关于变量和日期处理的面试题
  7. Eclipse快速导入继承类的方法
  8. 数据治理管理平台——元数据与主数据管理
  9. 16.[个人]C++线程入门到进阶(16)----线程函数:CreateThread与_beginthread
  10. UART协议就应该这么理解
  11. 计算机编程的地位,学习编程的重要性
  12. 印度影星沙鲁克-罕简介
  13. 云游戏拉开产业化大幕
  14. 快速删除node_modules(rimraf)
  15. k8s教程(基础篇)-基本概念和术语
  16. 不借助idea开发工具构建一个Javaweb项目
  17. php自我介绍50字,自我介绍50字
  18. 怎样在Word文档中插入空白页
  19. 最大似然估计,最大后验估计,贝叶斯估计联系与区别
  20. android oreo 老机型,Android Oreo 通知新特性,这坑老夫先踩了

热门文章

  1. python实例编程_python 编程实例 5
  2. oracle数据库转sqlite,Sqlite导入Oracle软件(SqliteToOracle)
  3. 程序员(工作2年)立flag,面四家,成三家,最后进了蚂蚁.....
  4. linux端口 fcs校验,我如何接收错误的以太网帧并禁用CRC / FCS计算?
  5. 汉字为什么能流传至今_汉字能流传至今,比毛不易还不易,它的同龄字统统都死掉了...
  6. bootstrap grid php,bootstrap grid用法
  7. 契税申报期限_税局正式公告!财产和行为税合并纳税申报!附税种申报要点
  8. mysql100链接同时处理_php 连接MYSQL 两个同时连接为什么只有一个连接成功,必须删掉一个,另外一个才查询生效出结果,下附代码...
  9. usb接口定义引脚说明_PerfDogService使用说明
  10. setnx和expire合成一条指令_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...