農民john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。現在,john想在農場裡新增一條路徑 ( 注意,恰好一條 )。對這條路徑有這樣的限制:乙個牧場的直徑就是牧場中最遠的兩個牧區的距離 ( 本題中所提到的所有距離指的都是最短的距離 )。考慮如下的兩個牧場,圖1是有5個牧區的牧場,牧區用「*」表示,路徑用直線表示。每乙個牧區都有自己的座標:
圖1所示的牧場的直徑大約是12.07106, 最遠的兩個牧區是a和e,它們之間的最短路徑是a-b-e。 這兩個牧場都在john的農場上。john將會在兩個牧場中各選乙個牧區,然後用一條路徑連起來,使得連通後這個新的更大的牧場有最小的直徑。注意,如果兩條路徑中途相交,我們不認為它們是連通的。只有兩條路徑在同乙個牧區相交,我們才認為它們是連通的。 現在請你程式設計找出一條連線兩個不同牧場的路徑,使得連上這條路徑後,這個更大的新牧場有最小的直徑。
#include
#inf 0x3f3f3f3f
#define pi acos(-1.0)
#define n 1001
#define mod 123
#define e 1e-6
using namespace std;
int x[n],y[n];
char s[n];
double g[150+10][150+10],f[150+10];
double calculate(int x1,int y1,int x2,int y2)
int main()
else
}else g[i][j]=0;}}
for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(g[i][j]>g[i][k]+g[k][j]) g[i][j]=g[i][k]+g[k][j];
for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(g[i][j]f[i]) f[i]=g[i][j];
double minn=inf;
for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if( g[i][j]==inf && minn>f[i]+f[j]+calculate(x[i],y[i],x[j],y[j]) ) minn=f[i]+f[j]+calculate(x[i],y[i],x[j],y[j]);
for(int i=1; i<=n; i++) if(minnprintf("%.6lf\n",minn);
return 0;
}
資料結構基礎45 牛的旅行 詳細題解
題目描述 農民john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。現在,john想在農場裡新增一條路徑 注意,恰好一條 對這條路徑有這樣的限制 乙個牧場的直徑就是牧場中最遠的兩個牧區的距離 本題中所提到的所有距離指的都...
資料結構基礎
資料結構定義 定義 一 資料元素集合 也可稱資料物件 中各元素的關係。定義 二 相互之間存在特定關係的資料元素集合。資料結構的種類 1 集合 2 線性結構 3 樹形結構 4 圖狀結構 或網狀結構 資料結構的形式定義 資料結構名稱 d,s 其中d為資料元素的有限集,s是d上關係的有限集 邏輯結構 資料...
基礎資料結構
1 雙鏈表。下面是c 版本的實現。include stdafx.h include 結構體 typedef struct nodedlink 初始化 void dlist dlink dl 求長度 int dlength dlink dl return i 查詢 dlink dsearch dlin...