傳送門
先讀懂題意哈,題意就是,我們連線兩個牧場得到乙個新牧場,然後在所有新牧場中輸出直徑最小的牧場的直徑。
然後,看著n最大150,感覺就像列舉。
然後我們按列舉算一下複雜度,應該是三次方,剛好。
所以我們的思路是,用鄰接鍊錶存圖。然後用floyd處理出最短路。
接下來我們需要處理出未連線時每個牧場的直徑,以及每個牧場內每乙個點到同一牧場其他點的距離中最大的距離。
接下來只要列舉點對就行了。
每次列舉出乙個點對,判斷是否屬於同一牧場,如果不屬於,就把他們連在一起,計算該新牧場的直徑,然後和答案比對即可。
至於新牧場的直徑如何求,我們想一下,對於乙個由a和b(設接點為a和b)兩個舊牧場組成的新牧場,它的直徑只有三種情況:
所以只要取這三者的最大值然後和答案比對即可。
當然,儲存牧場可以用並查集,也可以不用並查集,直接用兩點是否聯通來判斷(floyd處理後)。
順帶一提,對於01表的讀入方式,最好採用限定位數的整數讀入。如下:
scanf
("%1d"
,&d)
;
在%和d之間加上乙個數字1即可,表示唯讀一位數。
當然,你也可以用字元讀入。
但是你要注意,換行符的存在。
尤其是linux和windows環境下的換行符是不一樣的。
windows下只要讀乙個字元即可把換行符讀完,但linux下要讀兩個字元才可以。
所以最後**如下:
#include
#include
#include
#include
using
namespace std;
const
int maxn=
200;
struct pointpt[maxn]
;int n;
int vv[maxn]
;[maxn]
;double d[maxn]
;double area[maxn]
;int p[maxn]
;double
calc
(int a,
int b)
intfind
(int cur)
intmain()
memset
0x42
,sizeof);
for(
int i=
1;i<=n;i++
)for
(int i=
1;i<=n;i++)}
}memset
(vv,0,
sizeof
(vv));
for(
int i=
1;i<=n;i++
)memset
(d,0xc2
,sizeof
(d))
;memset
(area,
0xc2
,sizeof
(area));
for(
int k=
1;k<=n;k++)}
}for
(int i=
1;i<=n;i++)}
}for
(int i=
1;i<=n;i++)}
}double ans=
1000000000000.0
;for
(int i=
1;i<=n;i++)}
}printf
("%.6f"
,ans)
;return0;
}
洛谷1522 牛的旅行
洛谷1522 牛的旅行 題目描述 農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。john想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制...
XML換行符的問題
最近要完成乙個功能,將裝置中資料庫中的資料匯出成xml檔案,可以方便的用excel檢視。主要的實現就是qt中的qxmlstreamwriter類。其中有乙個功能就是要求excel中的單元格中的資料過多時,可以換行。一開始的 如下 qxmlstreamwriter xmlwriter xmlwrite...
Linux換行符和Windows換行符的區別與轉換
windows為乙個回車 r cr或 m 和乙個換行 n nl或lf 括號內是其它顯示方法 linux為乙個換行 n mac為乙個回車 r 檢視檔案是否含有windows換行符 windows notepad 檢視 顯示所有符號 linux file test.txt test.txt ascii ...