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,那麼兩個格仔的距離就...