windy有一塊矩形土地,被分為 nm 塊 11 的小格仔。 有的格仔含有障礙物。 如果從格仔a可以走到格仔b,那麼兩個格仔的距離就為兩個格仔中心的歐幾里德距離。 如果從格仔a不可以走到格仔b,就沒有距離。 如果格仔x和格仔y有公共邊,並且x和y均不含有障礙物,就可以從x走到y。 如果windy可以移走t塊障礙物,求所有格仔間的最大距離。 保證移走t塊障礙物以後,至少有乙個格仔不含有障礙物。
輸入格式:
第一行包含三個整數,n m t。 接下來有n行,每行乙個長度為m的字串,'0'表示空格子,'1'表示該格仔含有障礙物。
輸出格式:
包含乙個浮點數,保留6位小數。
輸入樣例#1:複製
3 3 0
001001
110輸出樣例#1:複製
1.414214
輸入樣例#2:複製
4 3 0
001001
011000
輸出樣例#2:複製
3.605551
輸入樣例#3:複製
3 3 1
001001
001sample output
輸出樣例#3:複製
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 。
資料範圍30,30,只有900個點,跑900次\(dijkstra\),複雜度\(n^2logn\),這裡跑的最短路跑的是乙個點到另乙個點所至少需要走的障礙數,貌似能過,再暴力列舉兩個點\(n^2\)判斷能不能到達,就這樣了。
#include#include#include#include#includeusing namespace std;
struct node
a[5010000];
typedef pairpr;
priority_queue,greater>q;
int len,last[1010010],vis[1010],d[1001][1001],mp[1000][1000],n,m,t;
int ar=;
int br=;
void add(int a1,int a2,int a3)
int real(int x,int y)
void dijkstra(int s)
); while(!q.empty()));}
}}
}double dis(int i,int j,int x,int y)
int main()
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
}double ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
dijkstra(real(i,j));
// cout<
SCOI2009 最長距離 最短路
注意,0 號格仔是可以走的,1 是用來隔斷的。然後,要確定最長距離,我們可以考慮成乙個點到另乙個點的最少需要搬掉幾個障礙物才可以,那麼問題可以轉變成最短路問題,然後在乙個個的去查詢即可。時間複雜度 include include include include include include inc...
1295 SCOI2009 最長距離
題目鏈結 題目大意 給出一張地圖,上面有些點有障礙物,現在有t個機會能夠移除障礙物,問地圖上點對間的最長的歐幾里得距離 題解 由於答案由一對點確定,很容易想到列舉這一對點 記列舉的第乙個點為st,第二個點為ed,以st跑spfa,d i 表示從st到i經過的最少的障礙數,對於每個ed,若d ed t...
P4162 SCOI2009 最長距離
題目鏈結 這道題資料範圍比較小,所以方法還是比較暴力的。思路 先按每個格仔的狀態,讓所有格仔與他周圍的格仔連一條權值為它連向那個格仔的值 0或1 然後我們n方列舉所有格仔跑最短路,最短路即為從起點到終點的最小障礙數。然後我們列舉所有最短路,先看他移除障礙後是否只用了小於等於k次機會,然後求出兩點間的...