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

如果枚举1号点走哪些点出去,就从那些点出发跑多源最短路即可。最短路不会重复经过一条边。

怎样枚举较优?需要枚举到答案的起点在一组、终点在另一组;考虑按点的编号二进制分组,即枚举每一位,为0的在一组,为1的在另一组。

因为两个点编号不同,所以二进制表示至少有1位不同,即任意两个点一定一度被分到过两个组里。

好像还有构造新图的更快的做法。不过也没管。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=4e4+,M=1e5+,K=;
int n,m,mx,hd[N],xnt=,to[M<<],nxt[M<<],w[M<<];
int dis[N],sta[N],top,ans=1e9,bin[K];
bool vis[N],use[M];
priority_queue<pair<int,int> >q;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return fx?ret:-ret;
}
void add(int x,int y,int z)
{
to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;w[xnt]=z;
}
void init()
{
int k=n;while(k)k>>=,mx++;mx--;
bin[]=;for(int i=;i<=mx;i++)bin[i]=bin[i-]<<;
}
void dj()
{
memset(vis,,sizeof vis);
while(q.size())
{
int k=q.top().second;q.pop();
if(vis[k])continue;vis[k]=;
for(int i=hd[k],v;i;i=nxt[i])
if(!use[i>>]&&dis[v=to[i]]>dis[k]+w[i])
{
dis[v]=dis[k]+w[i];
q.push(make_pair(-dis[v],v));
}
}
ans=min(ans,dis[]);
}
int main()
{
n=rdn(); m=rdn(); init();
for(int i=,u,v,z1,z2;i<=m;i++)
{
u=rdn();v=rdn();z1=rdn();z2=rdn();
add(u,v,z1);add(v,u,z2);
}
for(int i=hd[];i;i=nxt[i])sta[++top]=i;
for(int i=;i<=mx;i++)
{
memset(dis,0x3f,sizeof dis);
for(int j=;j<=top;j++)
{
int k=sta[j];
if(!(to[k]&bin[i]))
{
q.push(make_pair(-w[k],to[k]));use[k>>]=;
dis[to[k]]=w[k];
}
}
dj();
memset(dis,0x3f,sizeof dis);
for(int j=;j<=top;j++)
{
int k=sta[j];
if(to[k]&bin[i])
{
q.push(make_pair(-w[k],to[k]));use[k>>]=;
dis[to[k]]=w[k];
}
else use[k>>]=;
}
dj();
for(int j=;j<=top;j++)
if(to[sta[j]]&bin[i])use[sta[j]>>]=;
}
printf("%d\n",ans==1e9?-:ans);
return ;
}

bzoj 4398 福慧双修——二进制分组的更多相关文章

  1. bzoj 4398 福慧双修 —— 二进制分组+多起点最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 按二进制每一位是 0/1 把 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 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$ 这显然就是凸包了 以一个斜率不断向下(上)走   ...

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

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

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

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

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

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

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

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

  9. 【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组

    F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standa ...

随机推荐

  1. GDB调试多线程程序

    gdb有thread相关命令,如info thread(简写成info th)显示线程消息,b xx thread yy可以针对某个thread设置断点,thread xx(简写成thr xx)切换到 ...

  2. C - The C Answer (2nd Edition) - Exercise 1-16

    /* Revise the main routine of the longest-line program so it will correctly print the length of arbi ...

  3. 安装mongoDB遇见的一个路径问题

    如果安装路径不存在,则不会解压EXE软件! 安装monogoDB后,它不会自动添加执行路径! 意思就是安装路径是D盘下面的mongoDB文件夹,假如不存在这个文件夹,则不会安装成功 你需要添加路径: ...

  4. 最新ssh2构架

    构架要求: 1.最新ssh2jar包. 2.使用全注解. 3.给锁机制 4.缓存. 5.使用权限构架. 6. 前台构架用bootstraps. 今天任务: 搭建php环境.看代码.整理ssh2架构. ...

  5. SpringMVC:文件上传

    MultipartFile attach HttpServletRequest re commons-io-2.0.jar (一定要用2.0以上的版本,否则没有copyInputStreamToFil ...

  6. xhtml三种元素类型

    xhtml三种元素类型:块级元素/内联元素/可变元素 块级元素:独占一行.可自定义自己的宽度和高度.作为其他元素的容器,可容纳其他内联元素和块级元素,喻做一个盒子.内联元素:始终以行内逐个显示.不能设 ...

  7. 为什么应使用 Node.js

    为什么应使用 Node.js JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样,现在我们也可以在服务器上运行 JavaScrip ...

  8. 自己定义UITextField

    目的是实现例如以下的效果: UITextField的leftView是自己定义的UIView,当中: 1.包括一个居中显示的icon.而且上,左,下各有1px的间隙 2.左上和左下是圆角,右边没有圆角 ...

  9. [Cocoa]深入浅出Cocoa之Bonjour网络编程

    本文转载至 http://www.cnblogs.com/kesalin/archive/2011/09/15/cocoa_bonjour.html   深入浅出Cocoa之Bonjour网络编程 罗 ...

  10. 九度OJ 1092:Fibonacci (递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1923 解决:1378 题目描述: The Fibonacci Numbers{0,1,1,2,3,5,8,13,21,34,55...} ...