p1522 [usaco2.4] 牛的旅行 cow tours - 洛谷 | 電腦科學教育新生態 (luogu.com.cn)
牧區: 對應乙個點。
牧區之間的距離:實際上是兩點之間的 最短路。 不要理解成歐幾里得距離。只有 直接連線 的時候,才可以計算歐幾里得距離。
牧場: 乙個連通塊。
牧場直徑: 乙個牧場的直徑是這個牧場所有的牧區(點)之間 距離 的最大值。 說的繞一點就是 最短路的最大值。
使用一條邊連線兩個牧場,使得合成的乙個新的牧場的直徑最小。意思是加入一條邊之後,使得新的牧場的所有點對之間 最短路 的最大值 最小
使用 dfs 對連通塊染色標記:區分牧場。o(v + e) = o(n^2)o(v+e)=o(n2)
使用 floyd-warshall 演算法計算所有點對之間的 最短路。 o(n^3)o(n3)
計算每個牧場中,每個牧區點到其他點的 最短路 的最大值。(後面加邊的時候要用)
計算每個牧場中,所有最短路的最大值,即每個牧場的直徑。 這個可以與 3 一起計算。 o(n^2)o(n2)
最後是找答案:對任意兩個點,先判斷是否同乙個牧場。如果不是,考慮加入一條邊,變成乙個新的牧場。可以直接計算出通過這條邊的最短路的最大值。 需要注意的是,通過這條邊的最短路的最大值不一定是新牧場的所有最短路的最大值。這裡需要比較三個值(牧場 a 的所有最短路的最大值; 牧場 b 的所有最短路的最大值, 加邊後通過這條邊的最短路的最大值),才能得到正確的新牧場的直徑。 遍歷所有點對(或者一半), 找出 「新直徑」 的最小值。 o(n^2)o(n2)
最後的時間複雜度是 o(n^3)o(n3)。 空間複雜度也只是 o(n^2)o(n2)。
太噁心了,沒注意到double型別陣列memset不能用0x3f,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊氣死我了氣死我了氣死我了,卡了乙個小時,氣死我了氣死我了!!!!!!!!!!!!!!!!!!!!
1 #include 2view codeusing
namespace
std;
3 inline int
read()412
return
sum;13}
1415
const
int n=160;16
const
double inf=1e20;
17int
n,field[n];
18double
dist[n][n],zhijing[n],maxspace[n];
1920
struct
node
2127
}a[n];
2829
void dfs(int i,int
id)3036}
3738
void
floyd()
3947}48
}495051
intmain()
5261
62char
b[n];
63for(int i=0;i)
647273}
7475
int id=0; //
bfs求連通塊
76for(int i=0;i)
7780
81 floyd(); //
floyd求任意兩點之間的最短距離
8283
for (int i = 0; i < n; ++i) //
求每個連通塊內部的直徑
8491
92double min_d =inf, max_d;
93for(int i=0;i//
求最後答案
94103
}104
}105
106 printf("
%.6lf\n
",min_d);
107return0;
108 }
牛的旅行 Floyed Warshall
原題鏈結傳送門 d es crip tion description descri ptio n農民john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。這樣,農民john就有多個牧區了。john想在農場裡新增一條路徑 ...
牛的旅行 題解
農民joh njohn john 的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。這樣,農民joh njohn john 就有多個牧區了。j oh njohn john 想在農場裡新增一條路徑 注意,恰好一條 對這條路徑有...
1125 牛的旅行
農民john的農場裡有很多牧區,有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。現在,john想在農場裡新增一條路徑 注意,恰好一條 乙個牧場的直徑就是牧場中最遠的兩個牧區的距離 本題中所提到的所有距離指的都是最短的距離 考慮如下的兩個牧場,...