#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const int N=1e6+10,M=2*N;
int n,m,p[N];
double num[N];
struct Edge{
int a,b;
double w;
bool operator< (const Edge &W)const
{
return w< W.w;
}
}edges[M];
struct node{
int x;
int y;
}k[N];
double juli(int a,int b)
{
double ans=sqrt((double)(k[a].x-k[b].x)*(k[a].x-k[b].x)+(double)(k[a].y-k[b].y)*(k[a].y-k[b].y));
return ans;
}
int find(int x)
{
if(p[x]!=x)p[x]=find(p[x]);
return p[x];
}
void kruskal()
{
int i,j,cnt=0;
sort(edges,edges+m);
for(i=1;i<=m;i++)p[i]=i;
for(i=0,j=0;i<m;i++)
{
int a=edges[i].a,b=edges[i].b;
double w=edges[i].w;
a=find(a),b=find(b);
if(a!=b)
{
p[a]=b;
cnt++;
num[j++]=w;
}
}
for(int i=j-1;i>=0;i--)
{
cout<<num[i]<<endl;
}
cout<<endl<<cnt;
}
int main()
{
FILE *fp;
fp=fopen("D:/f1.txt","r");
fscanf(fp,"%d %d",&n,&m);
for(int i=0;i<m;i++)
{
fscanf(fp,"%d %d",&k[i].x,&k[i].y);
}
int sum=0;
for(int i=0;i<m;i++)
{
for(int j=i+1;j<m;j++)
{
double z=juli(i,j);
sum++;
edges[i].a=i,edges[i].b=j,edges[i].w=z;
}
}
// cout<<sum<<'A'<<endl;
kruskal();
return 0;
}
自己跑了下第三个数据点,结果和答案差的太离谱了