bzoj 3245 spfa
来源:互联网 发布:手机shell是什么软件 编辑:程序博客网 时间:2024/06/05 15:02
题意:n个点,编号为0~n-1,m条有向边,限速不为0的边按照限速前进,限速为0的边按进入这条道路时的速度前进(即到该条边起点的速度),给定终点,初始起点为点0,初始速度为70,问从点0到终点最快时间的路径
可以理解成拆点的spfa
dis[i,j]表示到达第i个点的速度为j,spfa更新时讨论该边的速度是否为0分别按两种方法更新,
每次更新dis[i,j]时,记录转移来的点和转移来的速度(注意并不是入队的时候才更新,并且要两个都记录,只记录转移来的点的话会出事情...mdzz)
var n,m,st,x,y,z,w :longint; minn,l,tot :longint; i :longint; ans :double; pre,other,len,v :array[0..50010] of longint; dis :array[0..200,0..510] of double; vis :array[0..200,0..510] of boolean; que :array[0..75010,0..1] of longint; last,way :array[0..200] of longint; fromn,fromv :array[0..200,0..510] of longint;procedure connect(x,y,vv,z:longint);begin inc(l); pre[l]:=last[x]; last[x]:=l; other[l]:=y; len[l]:=z; v[l]:=vv;end;procedure spfa;var h,tmp,tl,cur,p,q:longint;begin fillchar(dis,sizeof(dis),127); h:=0; tl:=1; que[1,0]:=1; que[1,1]:=70; dis[1,70]:=0; while (h<>tl) do begin h:=h mod 75005+1; cur:=que[h,0]; tmp:=que[h,1]; vis[cur,tmp]:=false; q:=last[cur]; while (q<>0) do begin p:=other[q]; if v[q]=0 then begin if dis[p,tmp]>dis[cur,tmp]+len[q]/tmp then begin dis[p,tmp]:=dis[cur,tmp]+len[q]/tmp; fromn[p,tmp]:=cur; fromv[p,tmp]:=tmp; if not vis[p,tmp] then begin vis[p,tmp]:=true; tl:=tl mod 75005+1; que[tl,0]:=p; que[tl,1]:=tmp; end; end; end else begin if dis[p,v[q]]>dis[cur,tmp]+len[q]/v[q] then begin dis[p,v[q]]:=dis[cur,tmp]+len[q]/v[q]; fromv[p,v[q]]:=tmp; fromn[p,v[q]]:=cur; if not vis[p,v[q]] then begin vis[p,v[q]]:=true; tl:=tl mod 75005+1; que[tl,0]:=p; que[tl,1]:=v[q]; end; end; end; q:=pre[q]; end; end;end;procedure print(x,v:longint);var y,xx:longint; i:longint;begin tot:=0; xx:=x; while (x<>-1) do begin inc(tot); way[tot]:=x; x:=fromn[xx,v]; v:=fromv[xx,v]; xx:=x; end; for i:=tot downto 2 do write(way[i]-1,' '); writeln(way[1]-1);end;begin read(n,m,st); inc(st); for i:=1 to m do begin read(x,y,z,w); connect(x+1,y+1,z,w); end; fillchar(fromn,sizeof(fromn),255); spfa; ans:=maxlongint; for i:=0 to 500 do if dis[st,i]<ans then begin ans:=dis[st,i]; minn:=i; end; print(st,minn);end.——by Eirlys
0 0
- bzoj 3245 spfa
- BZOJ 1001 & SPFA
- bzoj 1003(spfa+dp)
- BZOJ 1003 SPFA + DP
- BZOJ 1179 Tarjan + spfa
- bzoj 1003 dp+spfa
- bzoj 2662 && bzoj 2763 分层图spfa
- bzoj 1179(强连通+spfa)
- bzoj 3931(spfa+最大流)
- [BZOJ 2304][Apio2011]寻路:SPFA
- bzoj 4152 最短路SPFA
- bzoj 1598(SPFA+A*)
- BZOJ 3669 NOI2014 魔法森林 SPFA
- BZOJ 1295 SCOI2009 最长距离 SPFA+暴力
- BZOJ 1295 SCOI 2009 最长距离 SPFA
- BZOJ 2346 Baltic 2011 Lamp SPFA
- BZOJ 1179 APIO 2009 Atm Tarjan+SPFA
- BZOJ 3875 Ahoi2014 骑士游戏 SPFA
- linux设备驱动中的阻塞与非阻塞IO
- C++命名规则 整型宽度 整型溢出
- 《CLR via C#》读书笔记-线程同步(五)
- 《神经网络:回到未来》(Neural Nets Back to the Future)-ICML 2016
- hadoop2.2.0伪分布式搭建
- bzoj 3245 spfa
- dot命令生成流程图
- [替罪羊树 动态点分治 替罪羊式重构] BZOJ 3435 [Wc2014]紫荆花之恋 & UOJ #55 【WC2014】紫荆花之恋
- 生物密码具有唯一性和不变性,必须掌握在自己手中!
- 《牛客网剑指offer38题》输入一棵二叉树,求该树的深度
- 深入margin
- 消息队列技术的介绍和原理(MQ)
- 中缀表达式转换为后缀表达式 简易实现(c++)(简易表达式计算)
- android webview下载附件几种方法