BZOJ2069: [POI2004]ZAW
2069: [POI2004]ZAW
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 303 Solved: 138
[Submit][Status][Discuss]
Description
Byte山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是一条笔直通向“前面洞口”的道路.
隧道互相都不交叉(他们只在洞室相遇). 两个洞室要么就通过隧道连接起来,要么就经过若干隧道间接的相连.
现在决定组织办一个'King's of Byteotia Cup' 比赛. 参赛者的目标就是任意选择一条路径进入洞穴并尽快出来即可.
一条路径必须经过除了“前面洞口”之外还至少要经过其他一个洞室.一条路径中一个洞不能重复经过(除了“前面洞室”以外),类似的一条隧道也不能重复经
过.
一个著名的洞穴探险家 Byteala 正准备参加这个比赛. Byteala 已经训练了数月而且他已获得了洞穴系统的一套详细资料.
对于每条隧道他都详细计算了从两个方向经过所需要的时间. 经过一个洞室的时间很短可以忽略不记. 现在Byteala 向计算一条符合条件的最优路径.
Input
5000, 3 <= m <= 10000) 分别表示洞室的数目以及连接他们的隧道的数目. 洞室从1 到 n编号.
“前面洞室”的编号为1. 接下来m 行描述了所有的隧道. 每行四个整数a,b,c,d
表示从洞室a到洞室b需要c分钟的时间,而从洞室b到洞室a需要d分钟的时间, 1 <= a,b <= n, a <> b,
1 <= c,d <= 10000. 你可以假设符合要求的路径肯定存在.
Output
Sample Input
1 2 4 3
2 3 4 2
1 3 1 1
Sample Output
HINT
【题解】
http://blog.csdn.net/popoqqq/article/details/46458079
OrzPoPoQQQ
犯的傻逼错:
1、优先队列比较写反
2、A->B却没有B->A
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <vector>
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b)) inline void read(long long &x)
{
x = ;char ch = getchar(), c = ch;
while(ch < '' || ch > '')c = ch, ch = getchar();
while(ch <= '' && ch >= '')x = x * + ch - '', ch = getchar();
if(c == '-')x = -x;
} const long long MAXN = + ;
const long long MAXM = + ;
const long long INF = 0x3f3f3f3f; struct Edge
{
long long u,v,w,next;
Edge(long long _u, long long _v, long long _w, long long _next){u = _u;v = _v;w = _w;next = _next;}
Edge(){}
}edge[MAXM << ];
long long head[MAXN],cnt; void insert(long long a, long long b, long long c)
{
edge[++cnt] = Edge(a,b,c,head[a]);
head[a] = cnt;
} long long n,m,to1[MAXN],from1[MAXN],node[MAXN],tot; long long A = , B = ; struct Node
{
long long v, d;
Node(long long _v, long long _d){v = _v;d = _d;}
Node(){}
}; struct cmp
{
bool operator()(Node a, Node b)
{
return a.d > b.d;
}
}; std::priority_queue<Node, std::vector<Node>, cmp> q; long long d[MAXN], b[MAXN]; void dijstra(long long s)
{
memset(b, , sizeof(b));
memset(d, 0x3f, sizeof(d));
while(q.size())q.pop();
d[s] = ;
q.push(Node(s, ));
Node now;
while(q.size())
{
now = q.top(), q.pop();
if(now.d != d[now.v] || b[now.v])continue;
b[now.v] = ;
for(register long long pos = head[now.v];pos;pos = edge[pos].next)
{
long long v = edge[pos].v;
if(v > && v != A && v != B)continue;
if(b[v])continue;
if(d[now.v] + edge[pos].w < d[v])
{
d[v] = d[now.v] + edge[pos].w;
q.push(Node(v, d[v]));
}
}
}
} long long ans = INF; int main()
{
read(n);read(m);
register long long tmp1, tmp2, tmp3, tmp4;
for(register long long i = ;i <= m;++ i)
{
read(tmp1), read(tmp2), read(tmp3), read(tmp4);
if(tmp1 == )
{
node[++tot] = tmp2;
to1[tot] = tmp4;
from1[tot] = tmp3;
continue;
}
else if(tmp2 == )
{
node[++tot] = tmp1;
to1[tot] = tmp3;
from1[tot] = tmp4;
continue;
}
insert(tmp1, tmp2, tmp3);
insert(tmp2, tmp1, tmp4);
}
long long M = ;
while(( << M) <= n) ++ M;
-- M;
for(register long long i = ;i <= M;++ i)
{
for(register long long j = ;j <= tot;++ j)
{
if((node[j] >> i) & )
insert(A, node[j], from1[j]);
else
insert(node[j], B, to1[j]);
}
dijstra(A);
ans = min(ans, d[B]);
A = B + ;
B = B + ;
for(register long long j = ;j <= tot;++ j)
{
if((node[j] >> i) & )
insert(node[j], A, to1[j]);
else
insert(B, node[j], from1[j]);
}
dijstra(B);
ans = min(ans, d[A]);
A = B + ;
B = B + ;
}
printf("%d", ans);
return ;
}
BZOJ2069
BZOJ2069: [POI2004]ZAW的更多相关文章
- 2069: [POI2004]ZAW
2069: [POI2004]ZAW 链接 题意: 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. n≤5000,m≤10 ...
- BZOJ 2069: [POI2004]ZAW(Dijkstra + 二进制拆分)
题意 给定一个有 \(N\) 个点 \(M\) 条边的无向图, 每条无向边 最多只能经过一次 . 对于边 \((u, v)\) , 从 \(u\) 到 \(v\) 的代价为 \(a\) , 从 \(v ...
- 【刷题】BZOJ 2069 [POI2004]ZAW
Description 在Byte山的山脚下有一个洞穴入口. 这个洞穴由复杂的洞室经过隧道连接构成. 洞穴的入口是一条笔直通向"前面洞口"的道路. 隧道互相都不交叉(他们只在洞室相 ...
- BZOJ.2069.[POI2004]ZAW(最短路Dijkstra 按位划分)
题目链接 \(Description\) 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. \(n\leq5000,m\le ...
- bzoj 2096 [POI2004]ZAW——二进制枚举
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069 可以把直接相连的点分成 从1点出的一部分 和 走向1点的一部分.多起点最短路就和 ...
- BZOJ 2069 POI2004 ZAW 堆优化Dijkstra
题目大意:给定一张无向图.每条边从两个方向走各有一个权值,求从点1往出走至少一步之后回到点1且不经过一条边多次的最短路 显然我们须要从点1出发走到某个和点1相邻的点上,然后沿最短路走到还有一个和点1相 ...
- 【刷题】BZOJ 2407 探险
Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...
- 做题记录 To 2019.2.13
2019-01-18 4543: [POI2014]Hotel加强版:长链剖分+树形dp. 3653: 谈笑风生:dfs序+主席树. POJ 3678 Katu Puzzle:2-sat问题,给n个变 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- Java-slf4j:sfl4j
ylbtech-Java-slf4j:sfl4j 1.返回顶部 1. SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种 ...
- 2006-2007 ACM-ICPC | POJ3380 POJ3384 POJ3385 水题题解
// CF比赛链接:http://codeforces.com/gym/101650 // POJ链接:http://poj.org/searchproblem?field=source&ke ...
- varStatus实现<c:forEach获取元素的下标 集合长度
有时候需要获取元素的下标,来实现一个编号的效果 那么使用 varStatus可以实现 代码 效果 如果需要把序号倒着数 那就用集合的长度减去当前下标 首先引入 <%@ taglib prefix ...
- Could not resolve placeholder 'CUST_INDUSTORY' in string value "${CUST_INDUSTORY}"
问题描述 项目中的资源文件中写了个properties文件,内容这样的 CUST_FROM=002 CUST_INDUSTORY=001 CUST_LEVEL=006 在springmvc配置文件中加 ...
- webpack:Cannot find module 'extract-text-webpack-plugin'
问题: 在终端中使用此命令安装了extract-text-webpack-plugin,npm install -g extract-text-webpack-plugin并在webpack.conf ...
- C/C++获取系统当前时间
C/C++获取系统当前时间 C库中与系统时间相关的函数定义在<time.h>头文件中, C++定义在<ctime>头文件中. 一.time(time_t*)函数 函数定义如 ...
- HZOI20190820模拟27题解
A. 小奇挖矿2 显然的O(m)dp:$f[i]=max(f[i-4],f[i-7])+a[i]$,当然你要保证i,i-4,i-7都能到达 #include<iostream> #incl ...
- 内容溢出文字用"..."代替 以及超出文本内容换行
text-overflow:ellipsis; white-space:nowrap; overflow:hidden; 超出.....代替 overflow: hidden; word-break: ...
- 装配SpringBean(三)--XML方式实例
前一篇文章中已经介绍了XML方式装配bean的方式,本文将综合这些方式举一个实例并进行测试,我会把所有类型的参数都放在同一个类中进行测试,下面是我的类结构: 上图是我画的一个基本结构,可以看出该类中有 ...
- 【DM642学习笔记七】缓冲区管理BufferManagement
(参考文档:The TMS320DM642 VideoPort Mini-Driver ——3.2 Buffer Management) 认识输入/输出视频数据的缓冲区管理,有利于对视频图 ...