题目描述
给你一个\(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】鬼计之夜 最短路的更多相关文章
-
【xsy1162】鬼计之夜 最短路+二进制拆分
套路题(然而我没看题解做不出来) 题目大意:给你一个$n$个点,$m$条有向边的图.图中有$k$个标记点,求距离最近的标记点间距离. 数据范围:$n,m,k≤10^5$. 设$p_i表$示第$i$个标 ...
-
Python中三目计算符的正确用法及短路逻辑
今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘. 短路逻辑 Python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接 ...
-
计蒜客 28202. Failing Components-最短路(Dijkstra) (BAPC 2014 Preliminary ACM-ICPC Asia Training League 暑假第一阶段第一场 B)
B. Failing Components 传送门 题意就是单向图,从起点开始找最短路,然后统计一下个数就可以.方向是从b到a,权值为s. 直接最短路跑迪杰斯特拉,一开始用数组版的没过,换了一个队列版 ...
-
计蒜客 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. ...
-
计蒜客 31001 - Magical Girl Haze - [最短路][2018ICPC南京网络预赛L题]
题目链接:https://nanti.jisuanke.com/t/31001 题意: 一带权有向图,有 n 个节点编号1~n,m条有向边,现在一人从节点 1 出发,他有最多 k 次机会施展魔法使得某 ...
-
UOJ244 【UER #7】短路
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
-
HDU 5521 Meeting(虚拟节点+最短路)
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total ...
-
Web前端业界氛围极好的群——鬼懿IT
鬼群简介 鬼懿IT主群号:,鬼懿IT-成长群:181368696 , 创建于2005年12月 ,聚集的业内人事包括:阿当,大漠,辣妈,崔凯,Rei,周裕波,司徒正美,丸子,鬼森林,寒冬,franky, ...
-
【网络流24题】 No.14 孤岛营救问题 (分层图最短路)
[题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...
随机推荐
-
JS新API标准 地理定位(navigator.geolocation)/////////zzzzzzzzzzz
在新的API标准中,可以通过navigator.geolocation来获取设备的当前位置,返回一个位置对象,用户可以从这个对象中得到一些经纬度的相关信息. navigator.geolocation ...
-
Oracle常用命令
查看数据库锁的情况 SELECT object_name, machine, s.sid, s.serial# FROM gv$locked_object l, dba_objects o, gv$ ...
-
绑定线程到特定CPU处理器
参考这篇文章 http://blog.chinaunix.net/uid-27761170-id-5050258.html 代码如下: #define _GNU_SOURCE #include < ...
-
用过coreData或者sqlite吗?读写是分线程的吗?
文/natewang(简书作者)原文链接:http://www.jianshu.com/p/cb8dc61b12fa著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 如果不是要求特别高, ...
-
AFNetworking (3.1.0) 源码解析 <;五>;
这次主要开始讲解一下文件夹Serialization下的类AFURLRequestSerialization. AFURLRequestSerialization类遵守`AFURLRequestSer ...
-
keynote 代码高亮
brew install highlight (同时会安装 Lua 和 Boost) highlight -K 18 -s Vampire -u 'utf-8' -O rtf test.html | ...
-
Python--基础二
Python基础:字符串str & 列表list & 元组tuple & 字典dict & 集合set Python 基础 2 字符串 str 字符串是以单引号或双引号 ...
-
Java单例实现及分析
双重检验锁实现方式 public class Singleton { //定义一个私有的空构造方法,防止直接用new实例化 private Singleton() {} private static ...
-
cached-query 将缓存和查询数据库高速连接起来的轻类库
介绍 我们经常有这种需求:当我们把memcached增加到项目后我还还要写一个 cacheUtils 或者 cacheManager 之类的类来操作memcached. 而且一般的操作不外乎是这种操作 ...
-
Effective Java 第三版——49. 检查参数有效性
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...