地址点击打开链接
这个题目,理论上两个算法都可以过,但是prime要好一些,prime适合做稠密图,也就是边多的。表现能力更好。
Kruskal则适合处理稀疏图。
代码如下,有备注:
#include <iostream>
#include<cstdio>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 110
#define repf(i,from,to) for(int i =from ; i<=to ; i++)
#define ll long long
int n ;
struct Node{
double x ,y ;
}nodes[MAX];
double dis[MAX][MAX];
int flag[MAX];
double low[MAX];
double length(double x ,double y)
{
return sqrt(x*x+y*y);
}
int prim(){
double sum =0 ;
memset(flag,0,sizeof(flag));
int pos = 1 ;
flag[pos]=1;//标记第一个点,也就是起始点
for(int i = 1 ; i <=n;i++)
{
if(i!=1)
{
low[i]=dis[pos][i];//pos这个点到各个点的距离
}
}
for(int i = 1 ; i <n ; i++)//因为开始的时候已经找了1个(初始点),所以这里就需要在访问n-1就可以
{
double mini=9999999;
for(int j = 1 ; j<=n ; j++)//找一圈自己人
{
if(!flag[j]&&mini>low[j])
{
mini = low[j];
pos = j;
}
}
flag[pos]=1;
sum+=mini;
//更新能到达的
for(int j =1 ; j<=n ; j++)
{
if(!flag[j]&&low[j]>dis[pos][j])
{
low[j]=dis[pos][j];
}
}
}
printf("%.2lf\n",sum);
}
int main(){
while(~scanf("%d",&n))
{
for(int i = 1 ; i <=n ; i++)
{
scanf("%lf%lf",&nodes[i].x,&nodes[i].y);
}
for(int i = 1 ; i<=n ; i++)//n^2复杂度计算出所有的距离
{
for(int j =1; j<=n ; j++)
{
dis[i][j]=length(nodes[i].x-nodes[j].x,nodes[i].y-nodes[j].y);
}
}
prim();
}
}