题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398

按二进制每一位是 0/1 把 1 号点的儿子分成两组,分别作为起点和终点跑多起点最短路,最优解的起点和终点总有一次会被分到不同组里;

太久没写 dijkstra 竟然WA了4次...别忘了 priority_queue 是大根堆-_-,还要注意循环计数的 i,j 不要重了...

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7. int const xn=,xm=1e5+,inf=0x3f3f3f3f;
  8. int n,m,hd[xn],ct,nxt[xm<<],to[xm<<],w[xm<<],dis[xn],ans;
  9. bool vis[xn],in[xn],out[xn];
  10. struct N{
  11. int d,id;
  12. bool operator < (const N &y) const
  13. {return d>y.d;}//>
  14. };
  15. priority_queue<N>q;
  16. int rd()
  17. {
  18. int ret=,f=; char ch=getchar();
  19. while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
  20. while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
  21. return f?ret:-ret;
  22. }
  23. void add(int x,int y,int z){to[++ct]=y; nxt[ct]=hd[x]; w[ct]=z; hd[x]=ct;}
  24. void dij()
  25. {
  26. memset(vis,,sizeof vis);
  27. while(q.size())
  28. {
  29. int x=q.top().id; q.pop();
  30. if(vis[x])continue; vis[x]=;
  31. for(int i=hd[x],u;i;i=nxt[i])
  32. {
  33. if(vis[u=to[i]]||(u==&&out[x])||(x==&&in[u]))continue;
  34. if(dis[u]>dis[x]+w[i])
  35. dis[u]=dis[x]+w[i],q.push((N){dis[u],u});
  36. }
  37. }
  38. ans=min(ans,dis[]);
  39. }
  40. int main()
  41. {
  42. n=rd(); m=rd();
  43. for(int i=,x,y,z,k;i<=m;i++)
  44. {
  45. x=rd(); y=rd(); z=rd(); k=rd();
  46. add(x,y,z); add(y,x,k);
  47. }
  48. int cnt=,t=n; while(t)cnt++,t/=; ans=inf;
  49. for(int i=;i<cnt;i++)
  50. {
  51. memset(dis,0x3f,sizeof dis); while(q.size())q.pop();
  52. for(int j=hd[],u;j;j=nxt[j])
  53. {
  54. in[u=to[j]]=; out[u]=;
  55. if(u&(<<i))dis[u]=w[j],out[u]=,q.push((N){w[j],u});
  56. else in[u]=;
  57. }
  58. dij();
  59. memset(dis,0x3f,sizeof dis); while(q.size())q.pop();
  60. for(int j=hd[],u;j;j=nxt[j])
  61. {
  62. if(in[u=to[j]])in[u]=,out[u]=,dis[u]=w[j],q.push((N){w[j],u});
  63. else out[u]=,in[u]=;
  64. }
  65. dij();
  66. }
  67. printf("%d\n",(ans==inf?-:ans));
  68. return ;
  69. }

bzoj 4398 福慧双修 —— 二进制分组+多起点最短路的更多相关文章

  1. bzoj 4398 福慧双修——二进制分组

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 如果枚举1号点走哪些点出去,就从那些点出发跑多源最短路即可.最短路不会重复经过一条边. ...

  2. 题解 bzoj 4398福慧双修(二进制分组)

    二进制分组,算个小技巧 bzoj 4398福慧双修 给一张图,同一条边不同方向权值不同,一条边只能走一次,求从1号点出发再回到1号点的最短路 一开始没注意一条边只能走一次这个限制,打了个从一号点相邻节 ...

  3. [BZOJ 2989]数列(二进制分组+主席树)

    [BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[ ...

  4. bzoj 2069 [ POI 2004 ] ZAW —— 多起点最短路 + 二进制划分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069 首先,对于和 1 相连的点,一定是从某个点出发,回到另一个点: 所以需要枚举起点和终点 ...

  5. BZOJ 4140 凸包+二进制分组

    思路: $(x_0-x)^2+(y_0-y)^2<=x^2+y^2$ $y>=(-x_0/y_0)x+(x_0^2+y_0^2)/2y0$ 这显然就是凸包了 以一个斜率不断向下(上)走   ...

  6. 【技巧 二进制分组】bzoj4398: 福慧双修&&2407: 探险

    二进制分组也可以说是一种比较优美的拆贡献方式吧? Description 菩萨为行,福慧双修,智人得果,不忘其本.——唐朠立<大慈恩寺三藏法师传>有才而知进退,福慧双修,这才难得.——乌雅 ...

  7. 【BZOJ3821/UOJ46】玄学(二进制分组,线段树)

    [BZOJ3821/UOJ46]玄学(二进制分组,线段树) 题面 BZOJ UOJ 题解 呜,很好的题目啊QwQ. 离线做法大概可以线段树分治,或者直接点记录左右两次操作时的结果,两个除一下就可以直接 ...

  8. 【BZOJ4140】共点圆加强版(二进制分组)

    [BZOJ4140]共点圆加强版(二进制分组) 题面 BZOJ 题解 我卡精度卡了一天.... 之前不强制在线的做法是\(CDQ\)分治,维护一个凸壳就好了. 现在改成二进制分组,每次重建凸壳就好了. ...

  9. 【BZOJ2989】数列(二进制分组,主席树)

    [BZOJ2989]数列(二进制分组,主席树) 题面 BZOJ 权限题啊... Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即g ...

随机推荐

  1. 使用Crypto对数据进行加密解密

    注释都在代码里: 先撸客户端: from Crypto.Cipher import AES import base64,requests class Message(object): def __in ...

  2. Spring实战Day4

    profile与项目环境 使用profile根据环境创建bean,常用的情景是数据库的配置.一.配置方式1.在JavaConfig中配置 1.1在类上配置,生产环境不是"dev"的 ...

  3. Ubuntu 16.04安装微信

    微信没有出Linux的版本,但是可以通过以下方式解决: 1.使用网页版,除了没有公众号之后,一切都没问题,包括传文件等. 网页登录地址:https://wx.qq.com/ 2.使用第三方版本,只不过 ...

  4. QML 开发神奇加成之为网络资源设置本地缓存

    QML 开发神奇加成之为网络资源设置本地缓存 直接上码: #include <QNetworkAccessManager> #include <QNetworkDiskCache&g ...

  5. Intel Edision —— 从SSH无法连接到systemd

    前言 原创文章,转载引用务必注明链接.如有疏漏,欢迎斧正. 最近在试用Wyliodrin,安装过程中出现了两个问题,一是无法使用SSH登录到Edison:二是EDISON磁盘的问题.分别涉及到syst ...

  6. binary-tree-postorder-traversal——二叉树后续遍历

    Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...

  7. 日常方便使用的Python脚本实现

    目录 文件批量重命名 bin文件合并 正文 1.python根据不同条件批量实现文件重命名 因为下载的电视剧名字比较乱,但却按照下载时间顺序依次排列,而手动重命名或者找软件太麻烦,我就自己实现了个: ...

  8. 全国省市区三级联动js

    function Dsy(){ this.Items = {}; } Dsy.prototype.add = function(id,iArray){ this.Items[id] = iArray; ...

  9. hunnu--11545--小明的烦恼——找路径

    小明的烦恼--找路径  Time Limit: 2000ms, Special Time Limit:5000ms, Memory Limit:32768KB Total submit users:  ...

  10. python socket初探

    先看一段代码 import socket import sys import re def getServerContent(url): host_ip = socket.gethostbyname( ...