給出乙個方格圖,裡面有若干牆,求起點走到終點的最小代價。
有3
33個操作:
1、移向相鄰的格仔(上左下右)耗費1代價。
2、向上下左右乙個方向發射傳送門,傳送門將會在這個方向碰到的第乙個牆生成。最多存在2個傳送門,第3個傳送門發射時第1個傳送門會消失。耗費0代價。
3、走向傳送門,到達另乙個傳送門前面的格仔。耗費1代價。
轉化一下問題。
第一種就是向四周建權值為1的邊。
需要傳送時當四周無牆時,要傳送到發射的傳送門上,就是要走到最近的牆,就是從這個點向上下左右四個傳送的地方建權值為最近的牆的距離的邊。有牆也同理。
求解最短路即可。
#include
#include
#include
#include
int n, m, sx, sy, tx, ty, tot;
int a[
501]
[501
], ws[
250001
], wx[
250001
], wz[
250001
], wy[
250001];
int head[
250001
], ver[
2000001
], next[
2000001
], edge[
2000001
], d[
250001
], v[
250001];
char c[
500]
;void
add(
int u,
int v,
int w)
intid
(int x,
int y)
intidy
(int x)
intcheck
(int x,
int y)
void
spfa()
}}}int
main()
}for
(int i = n; i >=
1; i--
)for
(int j = m; j >=
1; j--)if
(a[i]
[j]) wy[
id(i, j)]=
id(i, j)
, wx[
id(i, j)]=
id(i, j)
;else wy[
id(i, j)
]= wy[
id(i, j +1)
], wx[
id(i, j)
]= wx[
id(i +
1, j)];
for(
int i =
1; i <= n; i++
)for
(int j =
1; j <= m; j++
)spfa()
;if(d[id
(tx, ty)]==
707406378
)printf
("no");
else
printf
("%d"
, d[
id(tx, ty)])
;}
JZOJ 3470 最短路 最短路 DFS
給定乙個n nn個點m mm條邊的有向圖,有k kk個標記點,要求從規定的起點按任意順序經過所有標記點到達規定的終點,問最短的距離是多少。最短路 dfs 首先,對於每乙個標記點和s ss點,以它們為起點跑一邊spfa,由於k 10 k leq10 k 10 所以我們就可以得到乙個只有s ss和標記點...
JZOJ 3470 最短路 最短路 DFS
給定乙個n n個點m m條邊的有向圖,有k k個標記點,要求從規定的起點按任意順序經過所有標記點到達規定的終點,問最短的距離是多少。最短路 dfs 首先,對於每乙個標記點和s s點,以它們為起點跑一邊spfa,由於k 10 k 10 所以我們就可以得到乙個只有s s和標記點的乙個有向圖,圖的每條邊是...
JZOJ 5459 密室 最短路
題目 給出乙個有向圖,走一條邊需要一些鑰匙,只有擁有這些鑰匙才可以走,走完後鑰匙不會消失。到達點可以獲得在這個點上的鑰匙。求從1 11到n nn的最短路。邊權均為1 終於找到一道spf aspfa spfa 的變形的題目了。這道題在普通spf aspfa spfa 的基礎上增加了條件,如果能處理好這...