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

第一行有两个数n 和 m (3 <= n <=
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

3 3
1 2 4 3
2 3 4 2
1 3 1 1

Sample Output

6

HINT

【题解】

http://blog.csdn.net/popoqqq/article/details/46458079

OrzPoPoQQQ

犯的傻逼错:

1、优先队列比较写反

2、A->B却没有B->A

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <queue>
  6. #include <vector>
  7. #define max(a, b) ((a) > (b) ? (a) : (b))
  8. #define min(a, b) ((a) < (b) ? (a) : (b))
  9.  
  10. inline void read(long long &x)
  11. {
  12. x = ;char ch = getchar(), c = ch;
  13. while(ch < '' || ch > '')c = ch, ch = getchar();
  14. while(ch <= '' && ch >= '')x = x * + ch - '', ch = getchar();
  15. if(c == '-')x = -x;
  16. }
  17.  
  18. const long long MAXN = + ;
  19. const long long MAXM = + ;
  20. const long long INF = 0x3f3f3f3f;
  21.  
  22. struct Edge
  23. {
  24. long long u,v,w,next;
  25. Edge(long long _u, long long _v, long long _w, long long _next){u = _u;v = _v;w = _w;next = _next;}
  26. Edge(){}
  27. }edge[MAXM << ];
  28. long long head[MAXN],cnt;
  29.  
  30. void insert(long long a, long long b, long long c)
  31. {
  32. edge[++cnt] = Edge(a,b,c,head[a]);
  33. head[a] = cnt;
  34. }
  35.  
  36. long long n,m,to1[MAXN],from1[MAXN],node[MAXN],tot;
  37.  
  38. long long A = , B = ;
  39.  
  40. struct Node
  41. {
  42. long long v, d;
  43. Node(long long _v, long long _d){v = _v;d = _d;}
  44. Node(){}
  45. };
  46.  
  47. struct cmp
  48. {
  49. bool operator()(Node a, Node b)
  50. {
  51. return a.d > b.d;
  52. }
  53. };
  54.  
  55. std::priority_queue<Node, std::vector<Node>, cmp> q;
  56.  
  57. long long d[MAXN], b[MAXN];
  58.  
  59. void dijstra(long long s)
  60. {
  61. memset(b, , sizeof(b));
  62. memset(d, 0x3f, sizeof(d));
  63. while(q.size())q.pop();
  64. d[s] = ;
  65. q.push(Node(s, ));
  66. Node now;
  67. while(q.size())
  68. {
  69. now = q.top(), q.pop();
  70. if(now.d != d[now.v] || b[now.v])continue;
  71. b[now.v] = ;
  72. for(register long long pos = head[now.v];pos;pos = edge[pos].next)
  73. {
  74. long long v = edge[pos].v;
  75. if(v > && v != A && v != B)continue;
  76. if(b[v])continue;
  77. if(d[now.v] + edge[pos].w < d[v])
  78. {
  79. d[v] = d[now.v] + edge[pos].w;
  80. q.push(Node(v, d[v]));
  81. }
  82. }
  83. }
  84. }
  85.  
  86. long long ans = INF;
  87.  
  88. int main()
  89. {
  90. read(n);read(m);
  91. register long long tmp1, tmp2, tmp3, tmp4;
  92. for(register long long i = ;i <= m;++ i)
  93. {
  94. read(tmp1), read(tmp2), read(tmp3), read(tmp4);
  95. if(tmp1 == )
  96. {
  97. node[++tot] = tmp2;
  98. to1[tot] = tmp4;
  99. from1[tot] = tmp3;
  100. continue;
  101. }
  102. else if(tmp2 == )
  103. {
  104. node[++tot] = tmp1;
  105. to1[tot] = tmp3;
  106. from1[tot] = tmp4;
  107. continue;
  108. }
  109. insert(tmp1, tmp2, tmp3);
  110. insert(tmp2, tmp1, tmp4);
  111. }
  112. long long M = ;
  113. while(( << M) <= n) ++ M;
  114. -- M;
  115. for(register long long i = ;i <= M;++ i)
  116. {
  117. for(register long long j = ;j <= tot;++ j)
  118. {
  119. if((node[j] >> i) & )
  120. insert(A, node[j], from1[j]);
  121. else
  122. insert(node[j], B, to1[j]);
  123. }
  124. dijstra(A);
  125. ans = min(ans, d[B]);
  126. A = B + ;
  127. B = B + ;
  128. for(register long long j = ;j <= tot;++ j)
  129. {
  130. if((node[j] >> i) & )
  131. insert(node[j], A, to1[j]);
  132. else
  133. insert(B, node[j], from1[j]);
  134. }
  135. dijstra(B);
  136. ans = min(ans, d[A]);
  137. A = B + ;
  138. B = B + ;
  139. }
  140. printf("%d", ans);
  141. return ;
  142. }

BZOJ2069

 

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

  1. 2069: [POI2004]ZAW

    2069: [POI2004]ZAW 链接 题意: 给定一张带权图(边是双向的,但不同方向长度不同).求从1出发,至少经过除1外的一个点,再回到1的最短路.点和边不能重复经过. n≤5000,m≤10 ...

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

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

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

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

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

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

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

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

  6. BZOJ 2069 POI2004 ZAW 堆优化Dijkstra

    题目大意:给定一张无向图.每条边从两个方向走各有一个权值,求从点1往出走至少一步之后回到点1且不经过一条边多次的最短路 显然我们须要从点1出发走到某个和点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. angularjs中使用swiper时不起作用,最后出现空白位

    controller.js中定义swipers指令: var moduleCtrl = angular.module('newscontroller',['infinite-scroll','ngTo ...

  2. npm 安装vue 报错Failed at the chromedriver@2.34.0 install script 'node install.js'

    提示版本不够,后来百度到,在你的vue项目包下执行: npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/ ...

  3. PHP函数高级(二)

    PHP函数基础:https://www.cnblogs.com/lxwphp/p/9867840.html   1.函数分类: 定义:完成某些功能的代码段 系统函数:字符串,数组,数字,日期时间 自定 ...

  4. 郝斌–SQL Server2005学习笔记

    数据库(Database)狭义上是指存储数据的仓库,广义上包含对数据进行存储和管理的软件(DBMS)和数据本身.数据库由表.关系和操作组成. 一.数据库简介 1.为什么需要数据库 数据库简化了对数据的 ...

  5. 元素显示v-show

    <!DOCTYPE html> <html lang="zh"> <head> <title></title> < ...

  6. OpenCASCADE动画功能2

    OpenCASCADE动画功能2 eryar@163.com OpenCASCADE是一个开发平台,主要提供三维曲面和实体建模.CAD数据交换及可视化等功能.OCCT最适用于开发三维建模CAD软件.加 ...

  7. HandlerInterceptorAdapter或HandlerInterceptor的使用

    Spring拦截器 HandlerInterceptorAdapter需要继承,HandlerInterceptor需要实现 可以作为日志记录和登录校验来使用 建议使用HandlerIntercept ...

  8. Mount- Linux必学的60个命令

    1.作用 mount命令的作用是加载文件系统,它的用权限是超级用户或/etc/fstab中允许的使用者. 2.格式 mount -a [-fv] [-t vfstype] [-n] [-rw] [-F ...

  9. jeecms v9导入myeclipse 2015 ehcache.xml报错问题

    1.找不到ehcache.xml文件问题 cache-context.xml <property name="configLocation"> <value> ...

  10. jeecms各种标签类(大部分,并没有包含一些其他的如text_cut html_cut之类)

    软件包 comjeecms.cms.action.directive 类摘要 ChannelDirective 栏目对象标签 ChannelListDirective 栏目列表标签 ChannelPa ...