【BZOJ4398】福慧双修(二进制,最短路)
题意:
此题中S=1
思路:Orz ManGod秒切此题
我觉得出入边权互换不太直观,就改了一下写法
第一次默认与1有关的第一条出边只出不入,第二次默认只入不出
var q,dis:array[..]of longint;
head,vet,next,len,flag,x,y,z,w,id,a,b,c,d:array[..]of longint;
inq:array[..]of boolean;
n,m,bz,t3,t4,tot,h1,t1,i,j,ans,m1,t,tmp:longint; procedure add(a,b,c:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
len[tot]:=c;
head[a]:=tot;
end; function who(x,y:longint):longint;
begin
if x= then exit(y);
exit(x);
end; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; procedure spfa;
var u,e,v,t,w:longint;
begin
t:=; w:=t1;
while h1<t1 do
begin
inc(h1); inc(t);
if t=*n+ then t:=;
u:=q[t]; inq[u]:=false;
e:=head[u];
while e<> do
begin
v:=vet[e];
if (flag[e]=)and(dis[u]+len[e]<dis[v]) then
begin
dis[v]:=dis[u]+len[e];
if not inq[v] then
begin
inc(t1); inc(w);
if w=*n+ then w:=;
q[w]:=v; inq[v]:=true;
end;
end;
e:=next[e];
end;
end;
end; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; begin
assign(input,'bzoj4398.in'); reset(input);
assign(output,'bzoj4398.out'); rewrite(output);
readln(n,m1);
for i:= to m1 do
begin
read(x[i],y[i],z[i],w[i]);
if (x[i]=)or(y[i]=) then
begin
inc(m); id[m]:=i;
a[m]:=x[i]; b[m]:=y[i]; c[m]:=z[i]; d[m]:=w[i];
end;
add(x[i],y[i],z[i]);
add(y[i],x[i],w[i]);
end; t:=trunc(ln(n)/ln())+;
ans:=maxlongint;
for i:= to t do
begin
for j:= to tot do flag[j]:=;
bz:=who(a[],b[]);
if a[]= then flag[id[]<<]:=
else flag[(id[]<<)-]:=; //out fillchar(inq,sizeof(inq),false);
fillchar(dis,sizeof(dis),$7f);
h1:=; t1:=;
inc(t1); q[t1]:=bz; inq[bz]:=true;
if a[]= then dis[bz]:=c[]
else dis[bz]:=d[]; for j:= to m do
begin
tmp:=who(a[j],b[j]);
t3:=bz and (<<(i-));
t4:=tmp and (<<(i-));
if t3<>t4 then //in
begin
if a[j]= then flag[(id[j]<<)-]:=
else flag[id[j]<<]:=;
end
else //out
begin
if a[j]= then flag[id[j]<<]:=
else flag[(id[j]<<)-]:=;
inc(t1); q[t1]:=tmp; inq[tmp]:=true;
if a[j]= then dis[tmp]:=c[j]
else dis[tmp]:=d[j];
end;
end;
spfa;
ans:=min(ans,dis[]);
end; for i:= to t do
begin
for j:= to tot do flag[j]:=;
bz:=who(a[],b[]);
if a[]= then flag[(id[]<<)-]:=
else flag[id[]<<]:=; //in fillchar(inq,sizeof(inq),false);
fillchar(dis,sizeof(dis),$7f);
h1:=; t1:=; for j:= to m do
begin
tmp:=who(a[j],b[j]);
t3:=bz and (<<(i-));
t4:=tmp and (<<(i-));
if t3<>t4 then //out
begin
if a[j]= then flag[id[j]<<]:=
else flag[(id[j]<<)-]:=;
inc(t1); q[t1]:=tmp; inq[tmp]:=true;
if a[j]= then dis[tmp]:=c[j]
else dis[tmp]:=d[j];
end
else //in
begin
if a[j]= then flag[(id[j]<<)-]:=
else flag[id[j]<<]:=;
end;
end;
spfa;
ans:=min(ans,dis[]);
end;
if ans> then writeln(-)
else writeln(ans);
close(input);
close(output);
end.
【BZOJ4398】福慧双修(二进制,最短路)的更多相关文章
- [bzoj4398] 福慧双修 最短路 二进制分组
---题面--- 题解: 考场上看的这道题,,,当时70分算法打挂了,今天才知道这个也是原题.... 首先,对于不跟1相邻的边,肯定不会经过两次,因为经过两次就回来了,除了增加路径长度之外没有任何意义 ...
- bzoj 4398 福慧双修 —— 二进制分组+多起点最短路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 按二进制每一位是 0/1 把 1 号点的儿子分成两组,分别作为起点和终点跑多起点最短路 ...
- 【技巧 二进制分组】bzoj4398: 福慧双修&&2407: 探险
二进制分组也可以说是一种比较优美的拆贡献方式吧? Description 菩萨为行,福慧双修,智人得果,不忘其本.——唐朠立<大慈恩寺三藏法师传>有才而知进退,福慧双修,这才难得.——乌雅 ...
- bzoj4398: 福慧双修
正边权无向图,一条边两个方向权值不一定相同,求经过点1的最小简单环 简单环包含了点1的一条出边和一条入边,且这两条边不同,因此可以枚举这两条边的编号的二进制表示中哪一位不同,用最短路求此时的最优解,时 ...
- bzoj 4398 福慧双修——二进制分组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 如果枚举1号点走哪些点出去,就从那些点出发跑多源最短路即可.最短路不会重复经过一条边. ...
- [BZOJ4398]福慧双修/[BZOJ2407]探险
题目大意: 给定一个$n(n\leq40000)$个点$m(m\leq100000)$条边的有向图,求从$1$出发回到$1$的不经过重复结点的最短路. 思路: 首先Dijkstra求出从1出发到每个结 ...
- 题解 bzoj 4398福慧双修(二进制分组)
二进制分组,算个小技巧 bzoj 4398福慧双修 给一张图,同一条边不同方向权值不同,一条边只能走一次,求从1号点出发再回到1号点的最短路 一开始没注意一条边只能走一次这个限制,打了个从一号点相邻节 ...
- hdu-6166(最短路+二进制分组)
题意:给你n个点m条边的有向图,然后再给你k个不同的点,问你这k个点的最小距离: 解题思路:这道题最需要注意的就是k个点一定是不同的,那么有一个结论就是任意两个不同的数字中,在他们的二进制地表示中,一 ...
- HDU 6166 Senior Pan(二进制分组+最短路)
题意 给出一个\(n\)个点\(m\)条边的有向图\((n,m<=100000)\),从中选择\(k\)个点\((k<=n)\),问这k个点两两之间的最短路最小值是多少? 思路 直接的想法 ...
随机推荐
- git 详细部署及其应用
第1章 版本控制系统 自动生成备份.随时回滚.知道改动的地方. 1.1 svn和git的区别 1.1.1 svn 集中式的版本控制系统,只有一个中央数据仓库,如果中央数据库仓库挂了或者不可访问,所有的 ...
- java 读取word
读取word文件 import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import org ...
- video 能播放声音不能播放视频,黑屏
与视频编码格式有关,mp4的视频编码有三种:MPEG4(DivX),MPEG4(Xvid),AVC(H264). 浏览器播放视频的支持有限,MP4格式的视频只支持h.264的视频: 视频编码: AVC ...
- checkbox全选和取消功能
这是开发中常见的小功能,想当初我也曾对于attr和prop的不了解踩过坑. 前端工作中,常常会使用到select复选框,select复选框有一个属性checked,当使用js或者jquery控制这个属 ...
- pyCharm最新激活码(2018)
1.修改hosts文件: 添加下面一行到hosts文件,目的是屏蔽掉Pycharm对激活码的验证 0.0.0.0 account.jetbrains.com windwos系统hosts文件路径为:C ...
- 每天学点Linux命令:倒叙打印文件第二行的前100个大写字母
sed -n | rev 处理第二行 grep:提取大写字母 o: 不显示非结果 tr:删除换行 Cut:截取1-100个字符 rev:逆序 断断续续搞了好长时间. ...
- 红黑树与AVL(平衡二叉树)的区别
关于红黑树和AVL树,来自网络: 1 好处 及 用途 红黑树 并不追求“完全平衡 ”——它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能. 红黑树能够以 O(log2 n) 的时间复 ...
- visual studio 2015安装
问题:安装过程老是报:安装包丢失或者损坏,但是去虚拟光驱里面可以查找到该安装包. 解决:可能文件下载ISO过程中丢失了一些数据.使用“Hash(MD5校验工具)”检测文件的“SHA-1”值,然后与官网 ...
- [ CodeForces 1065 B ] Vasya and Isolated Vertices
\(\\\) \(Description\) 求一个\(N\)个点\(M\)条边的无向图,点度为 \(0\) 的点最多和最少的数量. \(N\le 10^5,M\le \frac {N\times ( ...
- Android Error:Failed to resolve: com.afollestad:material-dialogs:
背景: 同事把Android项目直接考给了我...我在Android Studio上运行,然后提示: Error:Failed to resolve: com.afollestad:material- ...