题目描述

  给你一个\(n\)个点\(m\)条边的有向图,有\(k\)个关键点。求一条最短的从一个关键点到另一个关键点的路径。

  \(n,m,k\leq 100000\)

题解

  跑\(k^2\)次最短路显然会TLE

  考虑两个不同的数有什么可以利用的性质。

  其中会有至少一个二进制为不同!

  所以可以枚举所有二进制位,从\(0\)的那边向\(1\)的那边跑最短路,再从\(1\)的那边向\(0\)的那边跑最短路。

  这样最终答案一定会被计算到。

  时间复杂度:\(O(m\log n\log k)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<queue>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,int> pli;
struct graph
{
int h[100010];
int v[100010];
int w[100010];
int t[100010];
int n;
graph()
{
n=0;
memset(h,0,sizeof h);
}
void add(int x,int y,int z)
{
n++;
v[n]=y;
w[n]=z;
t[n]=h[x];
h[x]=n;
}
};
graph g;
//int lx[100010];
//int ly[100010];
//int lz[100010];
ll d[100010];
int b[100010];
int c[100010];
int n,m,k;
priority_queue<pli,vector<pli>,greater<pli> > q;
ll dij(int y)
{
int i;
memset(b,0,sizeof b);
for(i=1;i<=k;i++)
if((i>>(y-1))&1)
q.push(pli(0,c[i]));
while(!q.empty())
{
pli x=q.top();
q.pop();
if(b[x.second])
continue;
b[x.second]=1;
d[x.second]=x.first;
for(i=g.h[x.second];i;i=g.t[i])
q.push(pli(x.first+g.w[i],g.v[i]));
}
ll ans=0x7fffffffffffffffll;
for(i=1;i<=k;i++)
if(b[c[i]]&&!((i>>(y-1))&1))
ans=min(ans,d[c[i]]);
return ans;
}
ll dij2(int y)
{
int i;
memset(b,0,sizeof b);
for(i=1;i<=k;i++)
if(!((i>>(y-1))&1))
q.push(pli(0,c[i]));
while(!q.empty())
{
pli x=q.top();
q.pop();
if(b[x.second])
continue;
b[x.second]=1;
d[x.second]=x.first;
for(i=g.h[x.second];i;i=g.t[i])
q.push(pli(x.first+g.w[i],g.v[i]));
}
ll ans=0x7fffffffffffffffll;
for(i=1;i<=k;i++)
if(b[c[i]]&&(i>>(y-1))&1)
ans=min(ans,d[c[i]]);
return ans;
}
int main()
{
int x,y,z,i;
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
g.add(x,y,z);
}
for(i=1;i<=k;i++)
scanf("%d",&c[i]);
ll ans=0x7fffffffffffffffll;
for(i=1;i<=17;i++)
{
ans=min(ans,dij(i));
ans=min(ans,dij2(i));
}
printf("%lld\n",ans);
return 0;
}

【XSY1162】鬼计之夜 最短路的更多相关文章

  1. 【xsy1162】鬼计之夜 最短路+二进制拆分

    套路题(然而我没看题解做不出来) 题目大意:给你一个$n$个点,$m$条有向边的图.图中有$k$个标记点,求距离最近的标记点间距离. 数据范围:$n,m,k≤10^5$. 设$p_i表$示第$i$个标 ...

  2. Python中三目计算符的正确用法及短路逻辑

    今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘. 短路逻辑 Python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接 ...

  3. 计蒜客 28202. Failing Components-最短路(Dijkstra) (BAPC 2014 Preliminary ACM-ICPC Asia Training League 暑假第一阶段第一场 B)

    B. Failing Components 传送门 题意就是单向图,从起点开始找最短路,然后统计一下个数就可以.方向是从b到a,权值为s. 直接最短路跑迪杰斯特拉,一开始用数组版的没过,换了一个队列版 ...

  4. 计蒜客 39280.Travel-二分+最短路dijkstra-二分过程中保存结果,因为二分完最后的不一定是结果 (The 2019 ACM-ICPC China Shannxi Provincial Programming Contest M.) 2019ICPC西安邀请赛现场赛重现赛

    Travel There are nn planets in the MOT galaxy, and each planet has a unique number from 1 \sim n1∼n. ...

  5. 计蒜客 31001 - Magical Girl Haze - [最短路][2018ICPC南京网络预赛L题]

    题目链接:https://nanti.jisuanke.com/t/31001 题意: 一带权有向图,有 n 个节点编号1~n,m条有向边,现在一人从节点 1 出发,他有最多 k 次机会施展魔法使得某 ...

  6. UOJ244 【UER #7】短路

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  7. HDU 5521 Meeting(虚拟节点+最短路)

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total ...

  8. Web前端业界氛围极好的群——鬼懿IT

    鬼群简介 鬼懿IT主群号:,鬼懿IT-成长群:181368696 , 创建于2005年12月 ,聚集的业内人事包括:阿当,大漠,辣妈,崔凯,Rei,周裕波,司徒正美,丸子,鬼森林,寒冬,franky, ...

  9. 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)

    [题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...

随机推荐

  1. Latex(数学)

    目录 字体 罗马字体 \mathrm{} 斜体 \mathit{} 粗体 \mathbf{} 无衬线-f \mathsf{} 打字机字体 \mathtt{} 书法字体 \mathcal{} 黑板粗体 ...

  2. rest-framework频率组件

    throttle(访问频率)组件 1.局部视图throttle from rest_framework.throttling import BaseThrottle VISIT_RECORD={} c ...

  3. JavaScript中防止重复提交

    有这么一种情况: 页面有一个按钮,点击之后会触发Ajax请求,但是用户在点击之后,不知道是否点成功了,于是又点了一下,如果不加处理的话,就会进行两次Ajax请求,并且请求的数据都是一样的,对后端的程序 ...

  4. JEECG SSO kisso

    kisso: java 基于 Cookie 的 SSO 中间件 kisso https://gitee.com/baomidou/kisso kisso首页.文档和下载 - 基于 Cookie 的 S ...

  5. HTML中的几种空格

    HTML提供了5种空格实体(space entity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器.其他几种空格(       ‌‍)在不同浏览器中宽度各异.     ...

  6. java学习之—链表(1)

    /** * 单链表操作 * Create by Administrator * 2018/6/14 0014 * 下午 2:05 **/ public class Link { public int ...

  7. springboot No Identifier specified for entity的解决办法

    今天在做一个项目的时候遇到一个问题,实体类忘了指定主键id,然后报如下错误,也是自己粗心大意造成的,在此记录下. java.lang.IllegalStateException: Failed to ...

  8. NIO和经典IO

    NIO未必更快,在Linux上使用Java6完成的测试中,多线程经典I/O设计胜出NIO30%左右 异步I/O强于经典I/O:服务器需要支持超大量的长期连接,比如10000个连接以上,不过各个客户端并 ...

  9. jackson使用问题:mapper.readValue()将JSON字符串转反序列化为对象失败或异常

    问题根源:转化目标实体类的属性要与被转JSON字符串总的字段 一 一对应!字符串里可以少字段,但绝对不能多字段. 先附上我这段出现了问题的源码: // 1.接收并转化相应的参数.需要在pom.xml中 ...

  10. iperf网络测试

    iperf网络测试文档 地址: https://www.jianshu.com/p/942a9d9bc704