时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte
总提交: 245 测试通过:79
描述
Farmer John had just acquired several new farms! He wants to connect the farms with roads so that he can travel from any farm to any other farm via a sequence of roads; roads already connect some of the farms.
Each of the N (1 ≤ N ≤ 1,000) farms (conveniently numbered 1..N) is represented by a position (Xi, Yi) on the plane (0 ≤ Xi ≤ 1,000,000; 0 ≤ Yi ≤ 1,000,000). Given the preexisting M roads (1 ≤ M ≤ 1,000) as pairs of connected farms, help Farmer John determine the smallest length of additional roads he must build to connect all his farms.
输入
* Line 1: Two space-separated integers: N and M
* Lines 2..N+1: Two space-separated integers: Xi and Yi
* Lines N+2..N+M+2: Two space-separated integers: i and j, indicating that there is already a road connecting the farm i and farm j.
输出
* Line 1: Smallest length of additional roads required to connect all farms, printed without rounding to two decimal places. Be sure to calculate distances as 64-bit floating point numbers.
样例输入
4 1
1 1
3 1
2 3
4 3
1 4
样例输出
4.00
题目来源
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n,m; 5 const int MAX=1005; 6 const double INF=0x3f3f3f3f; 7 struct Point{ 8 double x,y; 9 }p[MAX]; 10 double g[MAX][MAX]; 11 bool vis[MAX]; 12 double mind[MAX]; 13 14 inline double DST(Point a,Point b){ 15 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 16 } 17 18 double prim(){ 19 double res=0,minn; 20 int k; 21 vis[1]=true; 22 for(int i=1;i<=n;i++){ 23 mind[i]=g[1][i]; 24 } 25 for(int i=1;i<=n-1;i++){ 26 minn=INF; 27 for(int j=1;j<=n;j++){ 28 if(!vis[j]&&mind[j]<minn){ 29 minn=mind[j]; 30 k=j; 31 } 32 } 33 vis[k]=true; 34 res+=minn; 35 for(int j=1;j<=n;j++){ 36 if(!vis[j]){ 37 mind[j]=min(mind[j],g[k][j]); 38 } 39 } 40 } 41 return res; 42 } 43 44 int main(){ 45 int u,v; 46 scanf("%d%d",&n,&m); 47 for(int i=1;i<=n;i++){ 48 scanf("%lf%lf",&p[i].x,&p[i].y); 49 } 50 for(int i=1;i<=n;i++){ 51 for(int j=i+1;j<=n;j++){ 52 g[j][i]=g[i][j]=DST(p[i],p[j]); 53 } 54 } 55 for(int i=0;i<m;i++){ 56 scanf("%d%d",&u,&v); 57 g[u][v]=g[v][u]=0; 58 } 59 printf("%.2f ",prim()); 60 }