poj2560

最小生成树

View Code
   
     
#include < iostream >
#include
< cstdio >
#include
< cstdlib >
#include
< cstring >
#include
< cmath >
using namespace std;

#define maxn 105

struct Point
{
double x, y;
} point[maxn];

double cost[maxn][maxn];
int n;

double dis( int a, int b)
{
return sqrt((point[a].x - point[b].x) * (point[a].x - point[b].x) + (point[a].y
- point[b].y) * (point[a].y - point[b].y));
}

void makecost()
{
for ( int i = 0 ; i < n; i ++ )
for ( int j = 0 ; j < n; j ++ )
cost[i][j]
= dis(i, j);
}

double prim()
{
double lowcost[maxn];
bool vis[maxn];

memset(vis,
0 , sizeof (vis));
for ( int i = 0 ; i < n; i ++ )
lowcost[i]
= - 1 ;
lowcost[
0 ] = 0 ;
vis[
0 ] = true ;
int pre = 0 ;
double ans = 0 ;
while ( 1 )
{
for ( int i = 0 ; i < n; i ++ )
if (lowcost[i] > lowcost[pre] + cost[i][pre] || lowcost[i] == - 1 )
lowcost[i]
= lowcost[pre] + cost[i][pre];
int best = 1000000000 ;;
pre
= - 1 ;
for ( int i = 0 ; i < n; i ++ )
if ( ! vis[i] && lowcost[i] < best)
{
best
= lowcost[i];
pre
= i;
}
if (pre == - 1 )
break ;
ans
+= lowcost[pre];
vis[pre]
= true ;
lowcost[pre]
= 0 ;
}
return ans;
}

int main()
{
// freopen("t.txt", "r", stdin);
scanf( " %d " , & n);
for ( int i = 0 ; i < n; i ++ )
scanf(
" %lf%lf " , & point[i].x, & point[i].y);
makecost();
printf(
" %.2f\n " , prim());
return 0 ;
}

你可能感兴趣的:(poj)