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) 收藏 举报
浙公网安备 33010602011771号