bzoj 4398 福慧双修 —— 二进制分组+多起点最短路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398
按二进制每一位是 0/1 把 1 号点的儿子分成两组,分别作为起点和终点跑多起点最短路,最优解的起点和终点总有一次会被分到不同组里;
太久没写 dijkstra 竟然WA了4次...别忘了 priority_queue 是大根堆-_-,还要注意循环计数的 i,j 不要重了...
代码如下:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- using namespace std;
- int const xn=,xm=1e5+,inf=0x3f3f3f3f;
- int n,m,hd[xn],ct,nxt[xm<<],to[xm<<],w[xm<<],dis[xn],ans;
- bool vis[xn],in[xn],out[xn];
- struct N{
- int d,id;
- bool operator < (const N &y) const
- {return d>y.d;}//>
- };
- priority_queue<N>q;
- int rd()
- {
- int ret=,f=; char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
- while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
- return f?ret:-ret;
- }
- void add(int x,int y,int z){to[++ct]=y; nxt[ct]=hd[x]; w[ct]=z; hd[x]=ct;}
- void dij()
- {
- memset(vis,,sizeof vis);
- while(q.size())
- {
- int x=q.top().id; q.pop();
- if(vis[x])continue; vis[x]=;
- for(int i=hd[x],u;i;i=nxt[i])
- {
- if(vis[u=to[i]]||(u==&&out[x])||(x==&&in[u]))continue;
- if(dis[u]>dis[x]+w[i])
- dis[u]=dis[x]+w[i],q.push((N){dis[u],u});
- }
- }
- ans=min(ans,dis[]);
- }
- int main()
- {
- n=rd(); m=rd();
- for(int i=,x,y,z,k;i<=m;i++)
- {
- x=rd(); y=rd(); z=rd(); k=rd();
- add(x,y,z); add(y,x,k);
- }
- int cnt=,t=n; while(t)cnt++,t/=; ans=inf;
- for(int i=;i<cnt;i++)
- {
- memset(dis,0x3f,sizeof dis); while(q.size())q.pop();
- for(int j=hd[],u;j;j=nxt[j])
- {
- in[u=to[j]]=; out[u]=;
- if(u&(<<i))dis[u]=w[j],out[u]=,q.push((N){w[j],u});
- else in[u]=;
- }
- dij();
- memset(dis,0x3f,sizeof dis); while(q.size())q.pop();
- for(int j=hd[],u;j;j=nxt[j])
- {
- if(in[u=to[j]])in[u]=,out[u]=,dis[u]=w[j],q.push((N){w[j],u});
- else out[u]=,in[u]=;
- }
- dij();
- }
- printf("%d\n",(ans==inf?-:ans));
- return ;
- }
bzoj 4398 福慧双修 —— 二进制分组+多起点最短路的更多相关文章
- bzoj 4398 福慧双修——二进制分组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 如果枚举1号点走哪些点出去,就从那些点出发跑多源最短路即可.最短路不会重复经过一条边. ...
- 题解 bzoj 4398福慧双修(二进制分组)
二进制分组,算个小技巧 bzoj 4398福慧双修 给一张图,同一条边不同方向权值不同,一条边只能走一次,求从1号点出发再回到1号点的最短路 一开始没注意一条边只能走一次这个限制,打了个从一号点相邻节 ...
- [BZOJ 2989]数列(二进制分组+主席树)
[BZOJ 2989]数列(二进制分组+主席树) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[ ...
- bzoj 2069 [ POI 2004 ] ZAW —— 多起点最短路 + 二进制划分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069 首先,对于和 1 相连的点,一定是从某个点出发,回到另一个点: 所以需要枚举起点和终点 ...
- 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$ 这显然就是凸包了 以一个斜率不断向下(上)走 ...
- 【技巧 二进制分组】bzoj4398: 福慧双修&&2407: 探险
二进制分组也可以说是一种比较优美的拆贡献方式吧? Description 菩萨为行,福慧双修,智人得果,不忘其本.——唐朠立<大慈恩寺三藏法师传>有才而知进退,福慧双修,这才难得.——乌雅 ...
- 【BZOJ3821/UOJ46】玄学(二进制分组,线段树)
[BZOJ3821/UOJ46]玄学(二进制分组,线段树) 题面 BZOJ UOJ 题解 呜,很好的题目啊QwQ. 离线做法大概可以线段树分治,或者直接点记录左右两次操作时的结果,两个除一下就可以直接 ...
- 【BZOJ4140】共点圆加强版(二进制分组)
[BZOJ4140]共点圆加强版(二进制分组) 题面 BZOJ 题解 我卡精度卡了一天.... 之前不强制在线的做法是\(CDQ\)分治,维护一个凸壳就好了. 现在改成二进制分组,每次重建凸壳就好了. ...
- 【BZOJ2989】数列(二进制分组,主席树)
[BZOJ2989]数列(二进制分组,主席树) 题面 BZOJ 权限题啊... Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即g ...
随机推荐
- 使用Crypto对数据进行加密解密
注释都在代码里: 先撸客户端: from Crypto.Cipher import AES import base64,requests class Message(object): def __in ...
- Spring实战Day4
profile与项目环境 使用profile根据环境创建bean,常用的情景是数据库的配置.一.配置方式1.在JavaConfig中配置 1.1在类上配置,生产环境不是"dev"的 ...
- Ubuntu 16.04安装微信
微信没有出Linux的版本,但是可以通过以下方式解决: 1.使用网页版,除了没有公众号之后,一切都没问题,包括传文件等. 网页登录地址:https://wx.qq.com/ 2.使用第三方版本,只不过 ...
- QML 开发神奇加成之为网络资源设置本地缓存
QML 开发神奇加成之为网络资源设置本地缓存 直接上码: #include <QNetworkAccessManager> #include <QNetworkDiskCache&g ...
- Intel Edision —— 从SSH无法连接到systemd
前言 原创文章,转载引用务必注明链接.如有疏漏,欢迎斧正. 最近在试用Wyliodrin,安装过程中出现了两个问题,一是无法使用SSH登录到Edison:二是EDISON磁盘的问题.分别涉及到syst ...
- binary-tree-postorder-traversal——二叉树后续遍历
Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...
- 日常方便使用的Python脚本实现
目录 文件批量重命名 bin文件合并 正文 1.python根据不同条件批量实现文件重命名 因为下载的电视剧名字比较乱,但却按照下载时间顺序依次排列,而手动重命名或者找软件太麻烦,我就自己实现了个: ...
- 全国省市区三级联动js
function Dsy(){ this.Items = {}; } Dsy.prototype.add = function(id,iArray){ this.Items[id] = iArray; ...
- hunnu--11545--小明的烦恼——找路径
小明的烦恼--找路径 Time Limit: 2000ms, Special Time Limit:5000ms, Memory Limit:32768KB Total submit users: ...
- python socket初探
先看一段代码 import socket import sys import re def getServerContent(url): host_ip = socket.gethostbyname( ...