USACO 2 4 牛的旅行 最短路

2021-10-01 15:08:38 字數 3914 閱讀 9846

農民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

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

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

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

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

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

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

8

1010

1510

2010

1515

2015

3015

2510

3010

01000000

10111000

01001000

01001000

01110000

00000010

00000101

00000010

22.071068
r2=min(mdis[i]+mdis[j]+dis[i,j])

re=max(r1,r2)

這樣的**實現起來比較簡單,裡面會加注釋:

#include

#include

#include

#include

using

namespace std;

long

long n,m;

double a[

201]

[201

],v[

100010];

char map[

200]

[200];

intmain()

memset

(a,100

,sizeof

(a))

;for

(int i=

1;i<=n;i++)}

}//輸入都懂

double r1=

0,r2=

100000000.0

;for

(int k=

1;k<=n;k++

)for

(int i=

1;i<=n;i++

)for

(int j=

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

(i!=j&&j!=k&&i!=k&&a[i]

[j]>a[i]

[k]+a[k]

[j])a[i]

[j]=a[i]

[k]+a[k]

[j];

//floyed求最短路都懂

for(

int i=

1;i<=n;i++

) v[i]

=maxx;

r1=max(r1,v[i]);

}//乙個是自己的最長直徑

for(

int i=

1;i<=n;i++)}

}//乙個是把兩點連起來的最長直徑

printf

("%0.6lf"

,max

(r1,r2));

//求最大:很多人會問為什麼,應為可能新連的點可能還沒原來的大(乙個牧場),所以取個最大。

}

#include

#include

#include

#include

using

namespace std;

long

long n,m;

double a[

201]

[201

],v[

151]

;double dis[

151]

[151];

//用來存圖

int v1[

151]

;char map[

200]

[200];

void

lzh(

int x)

dis[x]

[x]=0;

v1[x]=1

;for

(int i=

1;iif(k==0)

continue

; v1[k]=1

;for

(int j=

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

}double maxx=0;

for(

int i=

1;i<=n;i++)}

v[x]

=maxx;

}int

main()

memset

(a,100

,sizeof

(a))

;for

(int i=

1;i<=n;i++)}

}double r1=

0,r2=

100000000.0

;for

(int i=

1;i<=n;i++

)/*for(int i=1;i<=n;i++)

v[i]=maxx;

r1=max(r1,v[i]);

}*/for(

int i=

1;i<=n;i++)}

}printf

("%0.6lf"

,max

(r1,r2));

}

洛谷P1522牛的旅行 多源最短路

題目 或者 自建oj,歡迎光臨 分析 step1 用floyed求出任兩點最短路徑 step2 求出同一聯通塊中任一點可以到達的最遠距離,記作maxdis i 並求出maxdis i 的最大值maxx1 step3 列舉不聯通的兩個點,求出maxdis i maxdis j i,j間的距離 中的最小...

牛客練習賽24 E 青蛙(最短路)

有乙隻可愛的老青蛙,在路的另一端發現了乙個黑的東西,想過去一 竟。於是便開始踏上了旅途 一直這個小路上有很多的隧道,從隧道的a進入,會從b出來,但是隧道不可以反向走。這只青蛙因為太老了,所以很懶,現在想請你幫幫慢,問他最少需要幾步才可以到達對面。將小徑看作一條數軸,青蛙初始在0上,這只青蛙可以向前跳...

乙個人的旅行(最短路)

problem description input 輸入資料有多組,每組的第一行是三個整數t,s和d,表示有t條路,和草兒家相鄰的城市的有s個,草兒想去的地方有d個 接著有t行,每行有三個整數a,b,time,表示a,b城市之間的車程是time小時 1 a,b 1000 a,b 之間可能有多條路 接...