思路:編號,然後跑floyd,這是很清楚的。然後記錄每個點在這個聯通塊中的最遠距離。
然後分連通塊,列舉兩個點(不屬於同乙個連通塊的)建邊,計算可能的直徑 dist[i] + dist[j] + dis(i,j)。
當然,這裡有乙個需要注意,(sccno[x]表示屬於哪乙個編號的連通塊,sccdis[x]表示該連通塊的直徑),
在列舉點建邊,形成新的牧場,得到新的可能的直徑時,dist[i] + dist[j] + dis(i,j) >= max(sccdis[sccno[i]],sccdis[sccno[j]]),
這個是一定要成立的,因為新的可能的直徑不可能小於sccdis[sccno[i]] 和 sccdis[sccno[j]](結合題目意思)。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8using
namespace
std;
910 typedef long
long
ll;11
#define inf 1e11
12#define rep(i, j, k) for (int i = (j); i <= (k); i++)
13#define rep__(i, j, k) for (int i = (j); i < (k); i++)
14#define per(i, j, k) for (int i = (j); i >= (k); i--)
15#define per__(i, j, k) for (int i = (j); i > (k); i--)
1617
const
int n = 160;18
intg[n][n];
19double
f[n][n];
20double
dist[n];
21int
sccno[n];
22int
scccnt;
23double
sccdis[n];
24int
scct;
25int
head[n];
26int
cnt;
27int
n;28
29struct
nodepo[n];
3233
struct
edgee[n*n];
3839
void add(int u,int v,double
w)45
46 inline double dis(node& a,node&b)
4950
void dfs(int
u)56}57
58int
main()
7172
//點的輸入
73 rep(i,1
,n)76
77//
讀圖78 rep(i,1
,n)81
82//
建邊83
double
way;
84 rep(i,1,n) rep(j,i+1
,n) 91}
9293
//連通圖
94 rep(i,1,n) if(!sccno[i])
9899
100//
最短路101 rep(k,1,n) rep(i,1,n) rep(j,1
,n)104
105 rep(i,1
,n)110
}111
112//
連通塊最長直徑
113 rep(i,1
,n)116
117double ans_1 =inf;
118double
tmp;
119 rep(i,1,n) rep(j,1
,n)125
}126
127 printf("
%.6f\n
",ans_1);
128129
getchar();getchar();
130return0;
131 }
洛谷 P1522 牛的旅行 Cow Tours
題目描述 農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。john想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制 乙個牧場的直徑就是牧場...
洛谷P1522 牛的旅行 Cow Tours
農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。john想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制 乙個牧場的直徑就是牧場中最遠的兩...
洛谷 P1522 牛的旅行 Cow Tours
農民 john 的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john 就有多個牧場了。john 想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制 乙個牧場的直徑就是牧場中最...