換行符的問題 牛的旅行(洛谷1522)

2021-09-25 02:23:13 字數 1824 閱讀 5871

傳送門

先讀懂題意哈,題意就是,我們連線兩個牧場得到乙個新牧場,然後在所有新牧場中輸出直徑最小的牧場的直徑。

然後,看著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 ...