2069: [POI2004]ZAW

链接

题意:

  给定一张带权图(边是双向的,但不同方向长度不同)。求从1出发,至少经过除1外的一个点,再回到1的最短路。点和边不能重复经过。 n≤5000,m≤10000

分析:

  因为不能重复经过,不能直接最短路的,考虑去掉不能重复经过一个点的限制。

  可以枚举所有与1有边的点,然后从这里面枚举一个点的,求出到其他与1相连的点最短路,来更新。 

  这样显然复杂度是关于1的出度的,复杂度并不是很理想。

  然后这里有一个技巧,按照二进制某一位上的01分成两个集合,然后跑多源最短路。

  为什么可以呢?任何两个不同的点的二进制位最少存在一位不同。  

  复杂度$O(nlog^2n)$

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
#define pa pair<int,int>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = , INF = 1e9;
struct Edge{ int to, nxt, w; } e[];
int head[N], dis[N], df[N], dt[N], A[N], En;
bool vis[N];
priority_queue< pa, vector< pa >, greater< pa > > q; inline void add_edge(int u,int v,int w) {
++En; e[En].to = v, e[En].nxt = head[u], e[En].w = w; head[u] = En;
}
void Dijkstra() {
while (!q.empty()) {
int u = q.top().second; q.pop();
if (vis[u]) continue;
vis[u] = ;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (dis[v] > dis[u] + e[i].w) {
dis[v] = dis[u] + e[i].w;
q.push(pa(dis[v], v));
}
}
}
}
int main() {
int n = read(), m = read(), cnt = ;
for (int i = ; i <= m; ++i) {
int u = read(), v = read(), w;
if (u == ) {
df[v] = read(), dt[v] = read();
if (!vis[v]) vis[v] = , A[++cnt] = v;
}
else if (v == ) {
dt[u] = read(), df[u] = read();
if (!vis[u]) vis[u] = , A[++cnt] = u;
}
else {
w = read();add_edge(u, v, w);
w = read();add_edge(v, u, w);
}
}
int ans = INF;
for (int k = ; k <= cnt; k <<= ) {
for (int i = ; i <= n; ++i) dis[i] = INF, vis[i] = ;
for (int i = ; i <= cnt; ++i)
if (i & k) q.push(pa(dis[A[i]] = df[A[i]], A[i]));
Dijkstra();
for (int i = ; i <= cnt; ++i)
if (!(i & k)) ans = min(ans, dis[A[i]] + dt[A[i]]); for (int i = ; i <= n; ++i) dis[i] = INF, vis[i] = ;
for (int i = ; i <= cnt; ++i)
if (!(i & k)) q.push(pa(dis[A[i]] = df[A[i]], A[i]));
Dijkstra();
for (int i = ; i <= cnt; ++i)
if (i & k) ans = min(ans, dis[A[i]] + dt[A[i]]);
}
cout << ans;
return ;
}

2069: [POI2004]ZAW的更多相关文章

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

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

  2. 【刷题】BZOJ 2069 [POI2004]ZAW

    Description 在Byte山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是一条笔直通向"前面洞口"的道路. 隧道互相都不交叉(他们只在洞室相 ...

  3. BZOJ.2069.[POI2004]ZAW(最短路Dijkstra 按位划分)

    题目链接 \(Description\) 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. \(n\leq5000,m\le ...

  4. BZOJ 2069 POI2004 ZAW 堆优化Dijkstra

    题目大意:给定一张无向图.每条边从两个方向走各有一个权值,求从点1往出走至少一步之后回到点1且不经过一条边多次的最短路 显然我们须要从点1出发走到某个和点1相邻的点上,然后沿最短路走到还有一个和点1相 ...

  5. BZOJ2069: [POI2004]ZAW

    2069: [POI2004]ZAW Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 303  Solved: 138[Submit][Status][D ...

  6. bzoj 2096 [POI2004]ZAW——二进制枚举

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069 可以把直接相连的点分成  从1点出的一部分  和  走向1点的一部分.多起点最短路就和 ...

  7. 【刷题】BZOJ 2407 探险

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  8. 做题记录 To 2019.2.13

    2019-01-18 4543: [POI2014]Hotel加强版:长链剖分+树形dp. 3653: 谈笑风生:dfs序+主席树. POJ 3678 Katu Puzzle:2-sat问题,给n个变 ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. C#下使用XmlDocument详解

    XML在开发中作为文件存储格式.数据交换的协议用的非常普遍,各个编程语言有都支持.W3C也制定了XML DOM的标准.在这里主要介绍下.Net中的XmlDocument,包括xml读取和写入等功能.一 ...

  2. How To Change Log Rate Limiting In Linux

    By default in Linux there are a few different mechanisms in place that may rate limit logging. These ...

  3. 解析苹果的官方例子LazyTableImages实现图片懒加载原理

    解析苹果的官方例子LazyTableImages实现图片懒加载原理 首先在官网下载源码: https://developer.apple.com/library/ios/navigation/#sec ...

  4. 将亚马逊aws的ec2服务器的登陆方式改为密码登陆

    1.在用密钥登陆ec2后,为root用户创建密码: sudo passwd root 系统会让你输入两次密码 2.切换为root用户,并且编辑sshd_config文件,PasswordAuthent ...

  5. T440安装Win7系统

    于T440自带的是Win8系统,硬盘格式为GPT分区格式,而Win7必须要MRP格式,所以必须要将硬盘格式从GPT修改为MRP,方法如下: 准备工作,下载”电脑店U盘启动盘制作工具“(百度一下,去官网 ...

  6. mybatis #{}和${}的区别是什么

    #{}和${}的区别是什么?正确的答案是:#{}是预编译处理,${}是字符串替换.(1)mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法 ...

  7. 如何使用正则做文本数据的清洗(附免费AI视频福利)

    手工打造文本数据清洗工具 作者 白宁超 2019年4月30日09:43:59 前言:数据清理指删除.更正错误.不完整.格式有误或多余的数据.数据清理不仅仅更正错误,同样加强来自各个单独信息系统不同数据 ...

  8. virtualbox+vagrant学习-2(command cli)-9-vagrant Plugin命令

    Plugin 格式: vagrant plugin <command> [<args>] 这是用来管理插件的命令. 1)Plugin Expunge 格式: vagrant p ...

  9. ethereumjs/ethereumjs-common-2-API文档

    https://github.com/ethereumjs/ethereumjs-common/blob/master/docs/index.md 该API的调用的详细例子可见ethereumjs/e ...

  10. Srv数据格式

    1.简介 类似msg文件, srv文件是用来描述服务( service数据类型的, service通信的数据格式定义在*.srv中. 它声明了一个服务, 包括请求(request)和响应( reply ...