bzoj 1295 最長距離 最短路

2022-04-30 04:51:10 字數 1826 閱讀 4775

windy有一塊矩形土地,被分為 n*m 塊 1*1 的小格仔。 有的格仔含有障礙物。 如果從格仔a可以走到格仔b,那麼兩個格仔的距離就為兩個格仔中心的歐幾里德距離。 如果從格仔a不可以走到格仔b,就沒有距離。 如果格仔x和格仔y有公共邊,並且x和y均不含有障礙物,就可以從x走到y。 如果windy可以移走t塊障礙物,求所有格仔間的最大距離。 保證移走t塊障礙物以後,至少有乙個格仔不含有障礙物。

輸入檔案maxlength.in第一行包含三個整數,n m t。 接下來有n行,每行乙個長度為m的字串,'0'表示空格子,'1'表示該格仔含有障礙物。

輸出檔案maxlength.out包含乙個浮點數,保留6位小數。

【輸入樣例一】

3 3 0

001001

110【輸入樣例二】

4 3 0

001001

011000

【輸入樣例三】

3 3 1

001001

001【輸出樣例一】

1.414214

【輸出樣例二】

3.605551

【輸出樣例三】

2.828427

20%的資料,滿足 1 <= n,m <= 30 ; 0 <= t <= 0 。 40%的資料,滿足 1 <= n,m <= 30 ; 0 <= t <= 2 。 100%的資料,滿足 1 <= n,m <= 30 ; 0 <= t <= 30 。

題目大意

乙個$n \times m$的網格上有些格仔是障礙。如果兩個非障礙格仔四連通,那麼定義它們之間的距離為他們的歐幾里德距離,否則它們沒有距離。

現在你可以把其中的$t$個障礙格仔變為非障礙格仔,然後問,操作後中有距離的點對中最長的距離是多少。

由於$n, m$資料範圍小到爆,所以可以直接列舉從哪個格仔開始清理障礙格仔,用最短路演算法跑出到每個格仔最少清楚的障礙格仔數,然後暴力列舉所有可行的格仔,計算它和當前列舉的格仔的歐幾里德距離,然後更新答案。

1/**

2* bzoj

3* problem#1295

4* accepted

5* time: 724ms

6* memory: 1312k7*/

8 #include 9

using

namespace

std;

1011 typedef bool

boolean;

12#define pii pair13

#define fi first

14#define sc second

1516

const

int n = 35;17

18int

n, m, k;

19int

val[n][n];

20int

f[n][n];

21boolean vis[n][n];

22int ans = 0;23

char

str[n];

2425 inline void

init() 32}

3334

const

int mov[4][2] = , , , };

3536 queueque;

37void

spfa(pii s) 55}

56}57}

58}5960 inline void

solve() 69}

70 printf("

%.6lf\n

", sqrt((double

)ans));71}

7273

intmain()

BZOJ 1295 最長距離 最短路

考慮到矩陣尺寸的關係,可以列舉起點和終點,並且判斷是否可行即可。判斷起點和終點是否可以通過挖空至多t個障礙聯通。實際上就是求起點到終點的最短路。所以我們先建好圖,然後求以每個方格為起始點的最短路,複雜度o n m 2 logm 列舉起點和終點更新答案的複雜度是o n 2 m 2 總複雜度就是 nm ...

BZOJ 1295 最長距離 BFS 列舉

題目大意 windy有一塊矩形土地,被分為 n m 塊 1 1 的小格仔。有的格仔含有障礙物。如果從格仔a可以走到格仔b,那麼兩個格仔的距離就為兩個格仔中心的歐幾里德距離。如果從格仔a不可以走到格仔b,就沒有距離。如果格仔x和格仔y有公共邊,並且x和y均不含有障礙物,就可以從x走到y。如果windy...

BZOJ1295 SCOI2009 最長距離

time limit 10 sec memory limit 162 mb submit 1719 solved 935 submit status discuss windy 有一塊矩形土地,被分為 n m 塊 1 1 的小格仔。有的格仔含有障礙物。如果從格仔a可以走到格仔b,那麼兩個格仔的距離就...