题意:

此题中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】福慧双修(二进制,最短路)的更多相关文章

  1. [bzoj4398] 福慧双修 最短路 二进制分组

    ---题面--- 题解: 考场上看的这道题,,,当时70分算法打挂了,今天才知道这个也是原题.... 首先,对于不跟1相邻的边,肯定不会经过两次,因为经过两次就回来了,除了增加路径长度之外没有任何意义 ...

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4398 按二进制每一位是 0/1 把 1 号点的儿子分成两组,分别作为起点和终点跑多起点最短路 ...

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

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

  4. bzoj4398: 福慧双修

    正边权无向图,一条边两个方向权值不一定相同,求经过点1的最小简单环 简单环包含了点1的一条出边和一条入边,且这两条边不同,因此可以枚举这两条边的编号的二进制表示中哪一位不同,用最短路求此时的最优解,时 ...

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

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

  6. [BZOJ4398]福慧双修/[BZOJ2407]探险

    题目大意: 给定一个$n(n\leq40000)$个点$m(m\leq100000)$条边的有向图,求从$1$出发回到$1$的不经过重复结点的最短路. 思路: 首先Dijkstra求出从1出发到每个结 ...

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

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

  8. hdu-6166(最短路+二进制分组)

    题意:给你n个点m条边的有向图,然后再给你k个不同的点,问你这k个点的最小距离: 解题思路:这道题最需要注意的就是k个点一定是不同的,那么有一个结论就是任意两个不同的数字中,在他们的二进制地表示中,一 ...

  9. HDU 6166 Senior Pan(二进制分组+最短路)

    题意 给出一个\(n\)个点\(m\)条边的有向图\((n,m<=100000)\),从中选择\(k\)个点\((k<=n)\),问这k个点两两之间的最短路最小值是多少? 思路 直接的想法 ...

随机推荐

  1. swoole多进程处理产生的问题

    以前用swoole的时候,没有涉及到数据库连接,碰到问题没有那么多,后来公司业务原生来写swoole多进程,问题出现很多 1.多进程之间会产生进程隔离,global无效,不能共用一个mysql,red ...

  2. JAVA的双色球 小程序

    还是挺简单的,功能过于强大. import java.util.Arrays; import java.util.Random; import java.util.Scanner; public cl ...

  3. 【js】再谈移动端的模态框实现

    移动端模态框的机制因为与PC的模态框机制一直有所区别,一直是许多新人很容易踩坑的地方,最近笔者作为一条老咸鱼也踩进了一个新坑中,真是平日里代码读得太粗略,故而写上几笔,以儆效尤. 故事的起因是这样的, ...

  4. WinForm ListBox 控件用法

    下面演示如何利用列表控件 ListBox 实现多选与移动选项: using IMS.WinFormClient.UserControls; using System; using System.Col ...

  5. MVC的学习-EF的认识

    1.什么是EF EF又称持久层框架:平时C#定义的变量是保存到内存中的,一断电就没有了.而持久的意思是数据保存到硬盘盘里(数据库的sql查询是在硬盘里进行的,所以速度很慢).EF帮我们将一个对象保存到 ...

  6. datagrid上面的查询按钮设置了,但是分页工具栏不显示

    原因:查询的linkbutton没有放在toolbar里. <script type="text/javascript"> $(function(){ $('#dg') ...

  7. 动态排序JavaBean

    Java中如果对对象排序可以考虑实现Comparable接口,但是需要排序的属性一旦指定就不能再修改.BeanUtils组件提供了对JavaBean动态排序的支持,即可以在运行时指定排序的属性.实例运 ...

  8. 【sqli-labs】 less65 GET -Challenge -Blind -130 queries allowed -Variation4 (GET型 挑战 盲注 只允许130次查询 变化4)

    双引号括号闭合 http://192.168.136.128/sqli-labs-master/Less-65/?id=1")%23

  9. 搭建linux环境:如何在vmware安装linux虚拟机??

    本来不想再整一遍的,奈何分布式压测呀,呀呀呀呀呀呀 1.安装linux虚机 (1)在桌面上双击VMware Workstation图标后启动虚拟机,鼠标单击文件,选择新的虚拟机: (2)单击“next ...

  10. linux ssh 利用scp传输文件

    使用方式如下: 1.上传本地文件到服务器 scp /path/filename username@servername:/path/ 例如scp /var/www/test.php root@192. ...