這道題乍一看非常頭疼,但仔細讀完題之後,我們明白它其實想讓我們求兩個牧場間最小可能的直徑。對於直徑的定義就是牧場中最遠兩個牧區之間的距離,而這個距離指的是最短路的距離,那麼我們將直徑分開來求。先跑一邊floyd計算兩個點之間的最短路,然後記錄在同乙個牧場內假如以乙個點作為道路構建的乙個出發點,在該牧場內離這個點最遠的那個點的距離(同乙個牧場內的牧區是兩兩互通的)。然後我們再處理道路相連的情況,列舉從兩個牧場內分別拿出乙個結點的情況,並加上拿出的這兩個節點之間的距離,不斷更新最小值即可。注意連上道路後的乙個大牧場它的直徑不一定是從先前的兩個牧區內分別選出兩個點得到的,比如牧區1:1號到3號距離為2,2號到3號距離為2 牧區2只有乙個4號結點,那麼將3和4相連後直徑所代表的兩點間的最大值應該是1到2的距離4(舉個例子,其具體情況不一定正確,但要知道有這麼一種情況需要判斷)。保留六位小數輸出即可
#include#include#include#include#include#include#includeusing namespace std;
const int inf=1e9;
int n;
struct loc
a[160];
double dis[160][160];
double ldis[160]; //牧區內到當前點距離最大值
double ans=inf;
double pos(int i,int j)
int main()
for(int i=1;i<=n;i++) }
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dis[i][j]!=inf)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dis[i][j]==inf)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dis[i][j]!=inf)
printf("%.6f",ans);
return 0;
}
洛谷P5049 洛谷P5022 題解 旅行
原題 資料加強版 加強版 參考你谷題解 終於調過了 又是一如既往的申必錯誤 noi plus石錘了 原題的資料允許我們 o n 2 暴力斷邊,但是加強版的資料達到了 n log n 級別,我們必須在斷邊這一環節尋求更好的解法。考慮我們進入環後在何處回溯 根據繼續走環走到的點分類 設當前已經從 b 走...
洛谷 P1522 牛的旅行 Cow Tours
題目描述 農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。john想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制 乙個牧場的直徑就是牧場...
洛谷P1522 牛的旅行 Cow Tours
農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。john想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制 乙個牧場的直徑就是牧場中最遠的兩...