http://acm.hdu.edu.cn/showproblem.php?pid=1162
下面是kruskal的
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <queue>
using namespace std;
#define inf 1000000.0
int c;
double dx[101],dy[101];
int set[101];
int find(int x)
{
int r=x;
while(set[r]!=r)
r=set[r];
int k;
while(x!=set[x])
{
k=set[x];
set[x]=r;
x=k;
}
return r;
}
void join(int a,int b)
{
int af=find(a);
int bf=find(b);
if(af!=bf)set[af]=bf;
}
struct heapmin
{
double d;
int x,y;
heapmin(double td,int tx,int ty):d(td),x(tx),y(ty){}
heapmin(){}
};
bool operator<(const heapmin &a,const heapmin &b)
{
return a.d>b.d;
}
bool operator>(const heapmin &a,const heapmin &b)
{
return a.d<b.d;
}
priority_queue<heapmin, vector<heapmin>,less<vector<heapmin>::value_type> >Q;//这样不是最大优先?忘了该得去看看stl了。。
void init()
{
while(!Q.empty())Q.pop();
for(int i=0;i<c;++i)
{
set[i]=i;
for(int j=0;j<c;++j)
{
double d=sqrt((dx[i]-dx[j])*(dx[i]-dx[j])+(dy[i]-dy[j])*(dy[i]-dy[j]));
if(i!=j){Q.push(heapmin(d,i,j));}
}
}
}
double kruskal()
{
double ret=0.0;
int n=0;
while(!Q.empty())
{
if(n>=c-1)break;
heapmin t=Q.top();
Q.pop();
//printf("-->%d %d %.2lf\n",t.x,t.y,t.d);
if(find(t.x)!=find(t.y))
{
ret+=t.d;
n++;
join(t.x,t.y);
}
}
return ret;
}
int main()
{
while(scanf("%d",&c)!=EOF)
{
for(int i=0;i<c;++i)
{
scanf("%lf%lf",&dx[i],&dy[i]);
}
init();
printf("%.2lf\n",kruskal());
}
return 0;
}
下面是prim的:
#include <stdio.h>
#include <string.h>
#include <math.h>
#define inf 1000000.0
int t,c;
int flag;
double mat[101][101];
double dx[101],dy[101];
void init()
{
for(int i=0;i<c;++i)
{
for(int j=0;j<c;++j)
{
double d=sqrt((dx[i]-dx[j])*(dx[i]-dx[j])+(dy[i]-dy[j])*(dy[i]-dy[j]));
if(i!=j)mat[i][j]=mat[j][i]=d;
else mat[i][j]=mat[j][i]=inf;
}
}
}
double prim()
{
double ret=0.0;
double min;
int i,j,k,l,u,num,v[101];
memset(v,0,sizeof(v));
v[0]=1;
num=1;
for(u=1;u<c;++u)
{
for(i=0,min=inf;i<c;++i)
{
if(v[i])
{
for(j=0;j<c;++j)
{
if(!v[j] && i!=j && min>mat[i][j])
{
min=mat[i][j];k=i;l=j;
}
}
}
}
if(min!=inf)
{
v[l]=1;mat[k][l]=mat[l][k]=0;ret+=min;
}
}
return ret;
}
int main()
{
while(scanf("%d",&c)!=EOF)
{
for(int i=0;i<c;++i)
{
scanf("%lf%lf",&dx[i],&dy[i]);
}
init();
printf("%.2lf\n",prim());
}
return 0;
}