您的位置:首页 > 其它

POJ 2560

2015-06-11 11:35 295 查看
#include<iostream>
#include<algorithm>
#include<cmath>
#include<iomanip>
#define MAXN 105
#define inf 1000000000
using namespace std;

typedef double elem_t;

double point[MAXN][2];
double _m[MAXN][MAXN];
int pre[MAXN];
elem_t prim(int n,elem_t mat[][MAXN],int* pre);
int main()
{
//freopen("acm.acm","r",stdin);
int num;
int i;
int j;
double x;
double y;
cin>>num;
for(i = 0; i < num; ++ i)
{
cin>>point[i][0]>>point[i][1];
}
for(i = 0; i < num; ++ i)
{
for(j = i+1; j < num; ++ j)
{
_m[i][j] = sqrt((point[i][0] - point[j][0])*(point[i][0] - point[j][0]) + (point[i][1] - point[j][1])*(point[i][1] - point[j][1]));
_m[j][i] = _m[i][j];
}
}
cout<<setiosflags(ios::fixed)<<setprecision(2)<<prim(num,_m,pre)<<endl;
}

elem_t prim(int n,elem_t mat[][MAXN],int* pre){
elem_t min[MAXN],ret=0;
int v[MAXN],i,j,k;
for (i=0;i<n;i++)
min[i]=inf,v[i]=0,pre[i]=-1;
for (min[j=0]=0;j<n;j++){
for (k=-1,i=0;i<n;i++)
if (!v[i]&&(k==-1||min[i]<min[k]))
k=i;
for (v[k]=1,ret+=min[k],i=0;i<n;i++)
if (!v[i]&&mat[k][i]<min[i])
min[i]=mat[pre[i]=k][i];
}
return ret;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: