poj 2560(prime)

一:
#include<iostream>
#include
<cstdio>
#include
<cmath>
#include
<cstring>
using namespace std;
#define MAXN 150
#define inf 99999999
double map[MAXN][MAXN],x[MAXN],y[MAXN],dis[MAXN];
int mark[MAXN];
double prime (int n)
{
int i,j,min,now=0;
double ans=0;

memset(mark,
0,sizeof(mark));
for(i=0;i<n;i++)
dis[i]
=inf;
for(i=0;i<n;i++)
{
double mie=inf;
for(j=0;j<n;j++)
{
if(!mark[j])
{
if(dis[j]>map[now][j])
dis[j]
=map[now][j];
if(dis[j]<mie)
{
mie
=dis[j];
min
=j;
}
}
}
now
=min;
mark[now]
=1;
}
for(i=0;i<n;i++)
ans
+=dis[i];
return ans;
}
double mydis(int i,int j)
{
double a=x[i]-x[j];
double b=y[i]-y[j];
return sqrt(a*a+b*b);
}
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf(
"%lf%lf",&x[i],&y[i]);

memset(map,
0,sizeof(map));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
map[i][j]
=map[j][i]=mydis(i,j);
printf(
"%.2f\n",prime(n));
}
return 0;
}

二:
#include<iostream>
#include
<cmath>
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int Max = 105;
const double inf = 99999999;

struct Point{
double x, y;
}p[Max];
double map[Max][Max], dis[Max];

double prim(int n){
int i, j, mi_n, now = 0;
double mi_e, ans = 0;
for(i = 0; i < n; i ++)
dis[i]
= inf;
for(i = 1; i < n; i ++){
dis[now]
= -1;
mi_e
= inf;
for(j = 0; j < n; j ++)
if(now != j && dis[j] >= 0){
dis[j]
= min(dis[j], map[now][j]);
if(dis[j] < mi_e){
mi_e
= dis[j];
mi_n
= j;
}
}
now
= mi_n;
ans
+= mi_e;
}
return ans;
}

double mydis(int i, int j){
double a = p[i].x - p[j].x;
double b = p[i].y - p[j].y;
return sqrt(a*a + b*b);
}

int main(){
int n, i, j;
while(scanf("%d", &n) != EOF){
for(i = 0; i < n; i ++){
scanf(
"%lf%lf", &p[i].x, &p[i].y);
for(j = 0; j < i; j ++)
map[i][j]
= map[j][i] = mydis(i, j);
}
printf(
"%.2lf\n", prim(n));
}
return 0;
}

posted on 2011-06-11 14:18  thinking001  阅读(134)  评论(0)    收藏  举报

导航