牛的旅行 Floyed Warshall

2021-10-01 18:37:54 字數 3471 閱讀 4281

原題鏈結傳送門

d es

crip

tion

description

descri

ptio

n農民john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。這樣,農民john就有多個牧區了。

john想在農場裡新增一條路徑(注意,恰好一條)。對這條路徑有以下限制:

乙個牧場的直徑就是牧場中最遠的兩個牧區的距離(本題中所提到的所有距離指的都是最短的距離)。考慮如下的有5個牧區的牧場,牧區用「*」表示,路徑用直線表示。每乙個牧區都有自己的座標:

這個牧場的直徑大約是12.07106, 最遠的兩個牧區是a和e,它們之間的最短路徑是a-b-e。

這兩個牧場都在john的農場上。john將會在兩個牧場中各選乙個牧區,然後用一條路徑連起來,使得連通後這個新的更大的牧場有最小的直徑。

注意,如果兩條路徑中途相交,我們不認為它們是連通的。只有兩條路徑在同乙個牧區相交,我們才認為它們是連通的。

輸入檔案包括牧區、它們各自的座標,還有乙個如下的對稱鄰接矩陣:

a b c d e f g h

a 0 1 0 0 0 0 0 0

b 1 0 1 1 1 0 0 0

c 0 1 0 0 1 0 0 0

d 0 1 0 0 1 0 0 0

e 0 1 1 1 0 0 0 0

f 0 0 0 0 0 0 1 0

g 0 0 0 0 0 1 0 1

h 0 0 0 0 0 0 1 0

輸入檔案至少包括兩個不連通的牧區。

請程式設計找出一條連線兩個不同牧場的路徑,使得連上這條路徑後,這個更大的新牧場有最小的直徑。

i np

utinput

inpu

t第1行: 乙個整數n (1 <= n <= 150), 表示牧區數

第2到n+1行: 每行兩個整數x,y (0 <= x ,y<= 100000), 表示n個牧區的座標。注意每個 牧區的座標都是不一樣的。

第n+2行到第2*n+1行: 每行包括n個數字(0或1) 表示如上文描述的對稱鄰接矩陣。

o ut

putoutput

output

只有一行,包括乙個實數,表示所求答案。數字保留六位小數。

s am

plei

nput

sample~input

sample

inpu

t810 10

15 10

20 10

15 15

20 15

30 15

25 10

30 10

01000000

10111000

01001000

01001000

01110000

00000010

00000101

00000010

s am

pleo

utpu

tsample~output

sample

outp

ut22.071068

最短路floyed-warshall

在模板上稍微改一點就好了。

在luogu竟然是藍題

p1522

floyed求出任兩點間的最短路

然後求出每個點到所有可達的點的最大距離,記做v[i

]v[i]

v[i]。r1=

max(

r1,v

[i])

r1=max(r1,v[i])

r1=max

(r1,

v[i]

)然後列舉不連通的兩點i,j

把他們連通,則新的直徑是v[i

]+v[

j]+(

i,j)

v[i]+v[j]+(i,j)

v[i]+v

[j]+

(i,j

)間的距離。

將它放進r2裡然後輸出max

(r1,

r2)max(r1,r2)

max(r1

,r2)

就好了。

#include

#include

#include

using

namespace std;

double dis[

500]

[500

],maxn,b[

500]

,r1,r2=

2147483647.0

;char m[

500]

[500];

int n,x[

500]

,y[500];

intmain()

for(

int w=

1; w<=n; w++

)//弗洛伊德演算法

for(

int i=

1; i<=n; i++

)for

(int j=

1; j<=n; j++)if

(i!=j&&i!=w&&w!=j&&dis[i]

[w]+dis[w]

[j][j])

dis[i]

[j]=dis[i]

[w]+dis[w]

[j];

for(

int i=

1; i<=n; i++

) b[i]

=maxn;

r1=max(r1,maxn);}

for(

int i=

1; i<=n; i++

)for

(int j=

1; j<=n; j++)if

(dis[i]

[j]==

2147483647.0

&&i!=j)

r2=min(r2,b[i]

+b[j]

+sqrt

((x[i]

-x[j])*

(x[i]

-x[j])+

(y[i]

-y[j])*

(y[i]

-y[j]))

);printf

("%.6lf"

,max

(r1,r2));

return0;

}

牛的旅行 題解

農民joh njohn john 的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。這樣,農民joh njohn john 就有多個牧區了。j oh njohn john 想在農場裡新增一條路徑 注意,恰好一條 對這條路徑有...

1125 牛的旅行

農民john的農場裡有很多牧區,有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。現在,john想在農場裡新增一條路徑 注意,恰好一條 乙個牧場的直徑就是牧場中最遠的兩個牧區的距離 本題中所提到的所有距離指的都是最短的距離 考慮如下的兩個牧場,...

洛谷1522 牛的旅行

洛谷1522 牛的旅行 題目描述 農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。john想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制...