usaco Cow Tours 牛的旅行
生活随笔
收集整理的這篇文章主要介紹了
usaco Cow Tours 牛的旅行
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Cow Tours 牛的旅行
農民 John 的農場里有很多牧區.有的路徑連接一些特定的牧區.一片所有連通的牧區稱為一個牧場.
但是就目前而言,你能看到至少有兩個牧區不連通.這樣,農民 John 就有多個牧區了. John 想在農
場里添加一條路徑(注意,恰好一條).對這條路徑有以下限制:
一個牧場的直徑就是牧場中最遠的兩個牧區的距離(本題中所提到的所有距離指的都是最短的距
離).考慮如下的有 5 個牧區的牧場,牧區用“*”表示,路徑用直線表示.每一個牧區都有自己的坐
標: 15,15 20,15
D E
*-------*
| _/|
| _/ |
| _/ |
|/ |
*--------*-------*
A B C
10,10 15,10 20,10
34
這個牧場的直徑大約是 12.07106, 最遠的兩個牧區是 A 和 E,它們之間的最短路徑是 A-B-E.
這里是另一個牧場:
*F 30,15
/
_/
_/
/
*------
G H
25,10 30,10
這兩個牧場都在 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
輸入文件至少包括兩個不連通的牧區.
請編程找出一條連接兩個不同牧場的路徑,使得連上這條路徑后,這個更大的新牧場有最小的直徑.
PROGRAM NAME: cowtour
INPUT FORMAT
第 1 行: 一個整數 N (1 <= N <= 150), 表示牧區數
第 2 到 N+1 行: 每行兩個整數 X,Y (0 <= X ,Y<= 100000), 表示 N 個牧區的坐標.注意每個 牧區
的坐標都是不一樣的.
第 N+2 行到第 2*N+1 行: 每行包括 N 個數字(0 或 1) 表示如上文描述的對稱鄰接矩陣.
SAMPLE INPUT (file cowtour.in)
8
10 10
15 10
20 10
15 15
20 15
30 15
25 10
30 10
01000000
10111000
01001000
35
01001000
01110000
00000010
00000101
00000010
OUTPUT FORMAT
只有一行,包括一個實數,表示所求答案.數字保留六位小數.
SAMPLE OUTPUT (file cowtour.out)
農民 John 的農場里有很多牧區.有的路徑連接一些特定的牧區.一片所有連通的牧區稱為一個牧場.
但是就目前而言,你能看到至少有兩個牧區不連通.這樣,農民 John 就有多個牧區了. John 想在農
場里添加一條路徑(注意,恰好一條).對這條路徑有以下限制:
一個牧場的直徑就是牧場中最遠的兩個牧區的距離(本題中所提到的所有距離指的都是最短的距
離).考慮如下的有 5 個牧區的牧場,牧區用“*”表示,路徑用直線表示.每一個牧區都有自己的坐
標: 15,15 20,15
D E
*-------*
| _/|
| _/ |
| _/ |
|/ |
*--------*-------*
A B C
10,10 15,10 20,10
34
這個牧場的直徑大約是 12.07106, 最遠的兩個牧區是 A 和 E,它們之間的最短路徑是 A-B-E.
這里是另一個牧場:
*F 30,15
/
_/
_/
/
*------
G H
25,10 30,10
這兩個牧場都在 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
輸入文件至少包括兩個不連通的牧區.
請編程找出一條連接兩個不同牧場的路徑,使得連上這條路徑后,這個更大的新牧場有最小的直徑.
PROGRAM NAME: cowtour
INPUT FORMAT
第 1 行: 一個整數 N (1 <= N <= 150), 表示牧區數
第 2 到 N+1 行: 每行兩個整數 X,Y (0 <= X ,Y<= 100000), 表示 N 個牧區的坐標.注意每個 牧區
的坐標都是不一樣的.
第 N+2 行到第 2*N+1 行: 每行包括 N 個數字(0 或 1) 表示如上文描述的對稱鄰接矩陣.
SAMPLE INPUT (file cowtour.in)
8
10 10
15 10
20 10
15 15
20 15
30 15
25 10
30 10
01000000
10111000
01001000
35
01001000
01110000
00000010
00000101
00000010
OUTPUT FORMAT
只有一行,包括一個實數,表示所求答案.數字保留六位小數.
SAMPLE OUTPUT (file cowtour.out)
22.071068
用floyd沒想到啊,到圖論了,圖論還得靠模板,還有因為懶有兩天沒寫昨天補了三題,這才幾天我就堅持不下來了。Floyd那三重循環的順序還不能弄錯不然就錯了,一開始就
弄錯了,看來自己對這個算法理解還不夠深刻。
/*
ID :jinbo wu
TASK: cowtour
LANG:C++
*/
#include<bits/stdc++.h>
using namespace std;
struct node
{int x,y;
}a[200];
double m[200][200];
double maxd[200];
double getd(node b,node c)
{return sqrt((c.x-b.x)*(c.x-b.x)+(c.y-b.y)*(c.y-b.y));
}
int main()
{freopen("cowtour.in","r",stdin);freopen("cowtour.out","w",stdout);int n;char c;cin>>n;double temp,mind=150000;for(int i=1;i<=n;i++)cin>>a[i].x>>a[i].y;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){cin>>c;if(c=='1')m[i][j]=getd(a[i],a[j]);else if(i!=j)m[i][j]=150000;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++){if(m[j][k]>m[j][i]+m[i][k])m[j][k]=m[j][i]+m[i][k];}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(m[i][j]>maxd[i]&&m[i][j]!=150000)maxd[i]=m[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(m[i][j]==150000){temp=getd(a[i],a[j])+maxd[i]+maxd[j];if(temp<mind)mind=temp;}for(int i=1;i<=n;i++)if(maxd[i]>mind)mind=maxd[i];printf("%.6lf\n",mind);
}
總結
以上是生活随笔為你收集整理的usaco Cow Tours 牛的旅行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京必玩景点推荐,北京有什么好玩的
- 下一篇: usaco ★Bessie Come H