rt,WA了#1,#3,#4,#5
代码:
#include<bits/stdc++.h>
using namespace std;
struct Edge
{
int pa,pb;
double w;
}a[1000001];
int n,m;
double ans;
int f[1000001],cnt,cnt2,point[1000001][3];
bool cmp(Edge a,Edge b)
{
return a.w<b.w;
}
int find(int x)
{
if(f[x]==x)
return x;
else
return f[x]=find(f[x]);
}
void Kruskal()
{
sort(a+1,a+1+cnt2,cmp);
for(int i=1;i<=cnt2;i++)
{
int ea=find(a[i].pa),eb=find(a[i].pb);
if(ea==eb)
continue;
f[ea]=eb;
ans+=a[i].w;
if(++cnt==n-1)
break;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
f[i]=i;
}
for(int i=1;i<=n;i++)
{
int tx,ty;
cin>>tx>>ty;
point[i][1]=tx;
point[i][2]=ty;
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
a[++cnt2].pa=i;
a[cnt2].pb=j;
a[cnt2].w=sqrt(1.0*(point[i][1]-point[j][1])*(point[i][1]-point[j][1])+1.0*(point[i][2]-point[j][2])*(point[i][2]-point[j][2]));
}
}
for(int i=1;i<=m;i++)
{
int px,py;
cin>>px>>py;
a[i].pa=px;
a[i].pb=py;
a[i].w=0.0;
}
Kruskal();
printf("%0.2lf",ans);
return 0;
}
样例输出4.27