jzoj P1422【汕头市选2012初中组】步行(walk)
2017-03-25 12:36
197 查看
题目大意:
对于每一个点都可以走到它的对应点a[i]或者把它对应的a[i]+1或-1,每一次花费操作次数1,求从点1到点N的最短操作次数。
题解:
bfs:
1.点只有一个时特判输0退出。
2.从第一个点的对应点a[1]开始搜,操作次数ans初值为1。
3.对于当前点如果对应点a[i]没有遍历则加入队列中遍历,对于当前点的左侧i-1如果没有遍历也加入队列,同理,对于点的右侧i+1没有遍历依然加入队列,然后把全部的f[i]更新,找出最优解,记住判断i±1是否越界。
对于每一个点都可以走到它的对应点a[i]或者把它对应的a[i]+1或-1,每一次花费操作次数1,求从点1到点N的最短操作次数。
题解:
bfs:
1.点只有一个时特判输0退出。
2.从第一个点的对应点a[1]开始搜,操作次数ans初值为1。
3.对于当前点如果对应点a[i]没有遍历则加入队列中遍历,对于当前点的左侧i-1如果没有遍历也加入队列,同理,对于点的右侧i+1没有遍历依然加入队列,然后把全部的f[i]更新,找出最优解,记住判断i±1是否越界。
var a,c,f:array [0..100001] of longint; v:array [0..100001] of boolean; n,i,j:longint; procedure bfs; var head,tail,i,k:longint; begin head:=0; tail:=1; f[1]:=0; v[1]:=true; f[a[1]]:=1; v[a[1]]:=true; c[1]:=a[1]; while head<tail do begin inc(head); i:=c[head]; if v[a[i]]=false then begin inc(tail); 4000 c[tail]:=a[i]; f[a[i]]:=f[i]+1; v[a[i]]:=true; end; if i-1>=1 then if v[i-1]=false then begin inc(tail); c[tail]:=i-1; f[i-1]:=f[i]+1; v[i-1]:=true; end; if i+1<=n then if v[i+1]=false then begin inc(tail); c[tail]:=i+1; f[i+1]:=f[i]+1; v[i+1]:=true; end; end; end; begin assign(input,'walk.in'); reset(input); assign(output,'walk.out'); rewrite(output); readln(n); if n=1 then begin writeln('0'); close(input);close(output); halt; end; for i:=1 to n do read(a[i]); bfs; writeln(f ); close(input); close(output); end.
相关文章推荐
- JZOJ 3.25 1422——【汕头市选2012初中组】步行(walk)
- 1422. 【汕头市选2012初中组】步行(walk) (jzoj)
- jzoj P1419【汕头市选2012初中组】排序(sort)
- jzoj P1420【汕头市选2012初中组】求和(sum)
- 汕头市选2012初中组 数数(count) (jzoj)
- jzoj P1421【汕头市选2012初中组】数数(count)
- JZOJ 3.25 1419——【汕头市选2012初中组】排序(sort)
- JZOJ 3.25 1420——【汕头市选2012初中组】求和(sum)
- JZOJ 3.25 1421【汕头市选2012初中组】数数(count)
- 1419. 【汕头市选2012初中组】排序(sort) (jzoj)
- [DP]【汕头市选2012初中组】数数(count)
- 【汕头市选2012初中组】求和(sum) 的”线段树“吐槽
- 【汕头市选2012初中组】数数(count) 的简单题解
- [排序]【汕头市选2012初中组】排序(sort)
- [数组]汕头市选2012初中组】求和(sum)
- JZOJ3082. 【NOIP2012模拟11.1】骰子游戏
- HDU 4444 Walk(2012金华,搜索)
- JZOJ 3636. 【BOI2012】Mobile
- jzoj P1667【coci2011/2012 1】PLES
- 【CQOI 2012】【BZOJ 2669】【JZOJ 4700】 Garden