#include <iostream>
#include <cmath>
using namespace std;
#define MAXN 100
#define INF 100000
double x[ MAXN ];
double y[ MAXN ];
double cost[ MAXN ][ MAXN ];
double lowcost[ MAXN ];
int closet[ MAXN ];
int n;
double prim(int v0)
{
int i, j, mindis, minone;
double ans = 0;
for(int i = 0; i < n; i ++)
{
lowcost[ i ] = cost[ v0 ][ i ];
closet[ i ] = v0;
}
for(int i = 0; i < n - 1; i ++)
{
mindis = INF;
for(int j = 0; j < n; j ++)
{
if(lowcost[ j ] != 0 && mindis > lowcost[ j ])
{
mindis = lowcost[ j ];
minone = j;
}
}
ans += lowcost[ minone ];
lowcost[ minone ] = 0;
for(int j = 0; j < n; j ++)
{
if(cost[ j ][ minone ] < lowcost[ j ])
{
lowcost[ j ] = cost[ j ][ minone ];
closet[ j ] = minone;
}
}
}
return ans;
}
int main()
{
while(scanf("%d", &n) != EOF)
{
int i = 0;
while(i < n)
{
scanf("%lf %lf", &x[ i ], &y[ i ]);
i ++;
}
for(int p = 0; p < n; p ++)
{
for(int q = 0; q < n; q ++)
{
cost[ p ][ q ] = sqrt((x[ p ] - x[ q ]) * (x[ p ] - x[ q ]) +
(y[ p ] - y[ q ]) * (y[ p ] - y[ q ]));
}
}
printf("%.2lf\n", prim(0));
}
return 0;
}
杭电ACM1162(最小生成树)
最新推荐文章于 2020-02-26 19:20:29 发布