题目大意:
给你n个点的坐标,任意两个点都可以相连
让你找出最小生成树的总边长
思路:最小生成树问题
prim or kruskal
代码:
prim算法(AC)
#include<iostream>
#include<stdio.h>
#include<queue>
#include<functional>
#include<math.h>
#include<cstring>
using namespace std;
struct vertex {
double x, y;
}v[100];
int n,e[110];
double ans,d[110];;
double dis(const vertex& v1,const vertex& v2)
{
return sqrt((v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y));
}
void prim()
{
memset(e, 0, sizeof(e));
ans = 0;
e[1]=1;
for(int i=1;i<=n;i++)
d[i]=dis(v[1],v[i]);
while(true){
double min = 1<<30;
int j=0;
for(int i=1;i<=n;i++)
if(!e[i]&&d[i]<min)
{
min = d[i]; //找到最小边以及最小边对应的点
j=i;
}
if(j==0)return;
ans+=min;
e[j]=1;//把点加进来,更新d[i]
for(int i=1;i<=n;i++)
{
double tmp=dis(v[j],v[i]);
if(tmp<d[i])
d[i] = tmp;
}
}
}
void read()
{
char line[5];
gets(line);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> v[i].x >> v[i].y;
}
int main()
{
//freopen( "c:\\data\\10034.txt", "r", stdin);
int c;
cin >> c;
while (c--)
{
read();
prim();
printf("%.2f\n", ans);
if(c)printf("\n");
}
return 0;
}