题意:

此题中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. iOS 关于文件操作 NSFileManager

    创建文件夹 + (BOOL)creatDir:(NSString *)path { if (path.length==0) { return NO; } NSFileManager *fileMana ...

  2. object-c中实现特定一个或者多个页面横竖屏,其他界面保持竖屏显示。

    1.首先设置项目支持的屏幕方向.info.plist设置(自行设置) 2.写一个子类CusNavigationController 继承 UINavigationController,在CusNavi ...

  3. 题解报告:hdu 2612 Find a way(双bfs)

    Problem Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. L ...

  4. 题解报告:hdu 1061 Rightmost Digit(快速幂取模)

    Problem Description Given a positive integer N, you should output the most right digit of N^N. Input ...

  5. 图灵机(转自wiki)

    图灵机(英语:Turing machine),又称确定型图灵机,是英国数学家艾伦·图灵于1936年提出的一种抽象计算模型,其更抽象的意义为一种数学逻辑机,可以看作等价于任何有限逻辑数学过程的终极强大逻 ...

  6. 牛客网-3 网易编程题(1拓扑&2二叉树的公共最近祖先&3快排找第K大数)

    1. 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更 ...

  7. Windows Install Twisted 安装Twisted

    1.下载twisted exe https://twistedmatrix.com/Releases/Twisted/15.4/ (注意最新版16.x没有适用于windows的exe,只能用旧版) 2 ...

  8. js实现点击上下按钮,图片向上向下循环滚动切换

    //popup.js //jquery.1.4.2-min.js (function(p,j){function u(){if(!c.isReady){try{v.documentElement.do ...

  9. Matlab2014的下载和安装激活过程

    Matlab2014的下载和安装过程 转载自csdn  https://blog.csdn.net/hp910315/article/details/70197149 1 下载Matlab2014,下 ...

  10. 阿里云机器学习tensorflow实践

    1,前言 伴随人工智能和深度学习的应用越来越普及,越来越多的开发人员开始投入到智能算法的编程中.由于算法成熟且公开,软件编码这一块不存在难度:但模型训练和预测所需的时间与硬件设备的配置有极大关系,很多 ...