bzoj1295 SCOI2009 最長距離

2022-07-27 06:06:10 字數 1819 閱讀 9378

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 。

題解

資料範圍很小,考慮以每乙個點為起點跑spfa,dis[i]記錄i點到該點的最小障礙物,然後判斷能否將這些障礙物刪除,更新最大距離。

1 #include2 #include3 #include4 #include5 #include6

#define maxn 35

7#define inf 1<<29

8using

namespace

std;

9 queueq;

10int dx[5]=,dy[5]=;

11int n,m,t,tot,a[maxn*maxn],head[maxn*maxn],vis[maxn*maxn],d[maxn*maxn],ecnt;

12double

ans;

13char str[35

];14

struct

edgee[maxn*maxn*4

];17

void addedge(int u,int

v)18

24int cal(int x,int y)

25bool ok(int x,int

y)26

30void spfa(int

x)31

37 d[x]=a[x];

38 vis[x]=1;39

q.push(x);

40while(!q.empty())

4155}56

}57}58

}59void search(int x,int y,int xx,int

yy)60

65int

main()

66 77}

78for(int i=1 ; i<=n ; ++i )

79for(int j=1 ; j<=m ; ++j)

8087}88

for(int i=1 ; i<=n ; ++i )

89for(int j=1 ; j<=m ; ++j )

9098 printf("

%.6lf

",ans);

99return0;

100 }

BZOJ1295 SCOI2009 最長距離

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

BZOJ1295 SCOI2009 最長距離

給出乙個n m的矩陣,有障礙物,a,b 和 c,d 存在距離當且僅當兩個點能互相到達,且距離為歐幾里德距離 可以移走t個障礙物,求出距離最大的兩個點的距離 n,m這麼這麼小 直接o n2m2 跑最短路,水題 include include include include include using ...

bzoj1295 SCOI2009 最長距離

scoi2009 最長距離 time limit 10 sec memory limit 162 mbwindy有一塊矩形土地,被分為 nm 塊 11 的小格仔。有的格仔含有障礙物。如果從格仔a可以走到格仔b,那麼兩個格仔的距離就為兩個格仔中心的歐幾里德距離。如果從格仔a不可以走到格仔b,就沒有距離...