1.1002
2.
3 1.0 1.0 2.0 2.0 2.0 4.0
3.41
3.最短路,prim算法,最小生成树
4.
#include <iostream>
#include <queue>
#include<stdio.h>
#include<cmath>
using namespace std;
const long MAXN=10000;
long father[MAXN];
long m,n;//点数 边数
//m标号从1开始
typedef struct
{
long from;
long to;
double cost;
}Edge;
bool operator <(const Edge &a, const Edge &b)
{
return a.cost>b.cost;
}
priority_queue<Edge> q;
Edge e;
void MakeSet()
{
long i;
for (i=0;i<=m;++i)
{
father[i]=i;
}
}
long Find(long i)
{
long r=i;
while (father[r]!=r)
{
r=father[r];
}
while (father[i]!=r)
{
long j=father[i];
father[i]=r;
i=j;
}
return r;
}
void Unition(long x,long y)
{
long fx=Find(x);
long fy=Find(y);
if (fx!=fy)
{
father[fx]=fy;
}
}
void Init()
{
while (!q.empty())
{
q.pop();
}
MakeSet();
long i,j;
double xx[105],yy[105];
for(i=1;i<=m;++i)
{
scanf("%lf%lf",&xx[i],&yy[i]);
}
for(i=1;i<=m;i++)
{
for(j=1;j<=m;j++)
{
if(i==j)
continue;
e.from=i;
e.to=j;
e.cost=sqrt((xx[i]-xx[j])*(xx[i]-xx[j])+(yy[i]-yy[j])*(yy[i]-yy[j]));
//printf("%0.2lf\n",e.cost);
q.push(e);
}
}
}
void print(double cost)
{
printf("%0.2f\n",cost);
}
void Kruskal()
{
Init();
long t=0;//表示合并次数
double cost=0;
Edge e;
while (!q.empty()&&t<m-1)
{
e=q.top();
long v1=e.from;
long v2=e.to;
if (Find(v1)!=Find(v2))
{
Unition(v1,v2);
cost+=e.cost;
++t;
}
q.pop();
}
print(cost);
}
int main()
{
while(~scanf("%ld",&m))//输入点与边
{
Kruskal();
}
return 0;
}