1、使用prim算法
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#define _DEBUG 1
#define VMAX 1001 //顶点最大个数
#define INF 0x3c3c3c3c
int n,m;
typedef struct{
double px;
double py;
}Pos;
bool hasEdge[VMAX][VMAX];//两点间是否有边
Pos vPos[VMAX];//顶点坐标
double d[VMAX];//到生成树距离
double dist(Pos u,Pos v){//两点的距离
return sqrt((u.px-v.px)*(u.px-v.px)+(u.py-v.py)*(u.py-v.py));
}
int find_min(double a[]){//寻找最小值的下标,且值>0
int min=INF;
int min_i=-1;
for(int i=1;i<=n;++i){
if(a[i]>=0.0 && a[i]<min){
min=a[i];
min_i=i;
}
}
return min_i;
}
void refresh(int u,int &count){//更新距离
int i;
//已有边情况
for(i=1;i<=n;++i){
if(d[i]>0.0 && hasEdge[u][i]){
d[i]=0.0;//设为0
//count++;
}
}
//处理其他
for(i=1;i<=n;++i){
if(d[i]<=0.0)continue;//忽略已在生成树中的点
double t=dist(vPos[i],vPos[u]);
if(t<d[i])
d[i]=t;
}
}
double prim(){
double length=0;
int i;
d[1]=0.0;//设置1节点到生成树距离为0,即从1开始
int count=0;
while(count<n){//直至找到n个点
int x=find_min(d);
assert(x!=-1);
length+=d[x];//扩展长度
d[x]=-1.0;//加入生成树
count++;
refresh(x,count);
}
return length;
}
int main(){
int i;
#if _DEBUG==1
freopen("3625.in","r"