求最小生成树,可用PRIM 也可用 KRUSKRAL 。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int father[110];
double x[110],y[110];
typedef struct{
int st;
int en;
double dist;
}Node;
Node g[5100];
int cmp(const void *a,const void *b){
Node * _a = (Node *) a;
Node * _b = (Node *) b;
return _a->dist - _b->dist;
}
int finds(int x){
return father[x] = x ? x: finds(father[x]);
}
int main(){
int i,j;
int t,n;
int cnt;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i = 0;i<n;i++) scanf("%lf%lf",&x[i],&y[i]);
cnt = 0;
for(i = 0;i<n;i++){
for(j = i+1;j<n;j++) {
g[cnt].st = i;
g[cnt].en = j;
g[cnt++].dist = sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
}
qsort(g,cnt,sizeof(g[0]),cmp);
for(i = 0;i<n;i++) father[i] = i;
double ans = 0;
for(i = 0;i<cnt;i++){
int fx = finds(g[i].st);
int fy = finds(g[i].en);
这里只给出 KRUSKRAL 的部分代码。望请谅解。