题意:给你一些点的坐标,然后求连通这些点的最小线段的长度。
解题思路:其实也就是最小生成树的题。只不过需要对这n个点全部处理一下,求出每对点之间的长度,然后存入邻接矩阵。然后就可以了。。
感想:一道稍微有点难度的最小生成树的题,,,仔细想想的话,还是很容易做出来的。。。
AC源码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
using namespace std;
const int N=10005;
double leftt[N],rightt[N];
int father[N],r[N];
struct point{
int x,y;
double value;
}aa[10005];
int cmp(const int i,const int j){
return aa[i].value<aa[j].value;
}
int find(int x){
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<N;++i){
father[i]=i;
r[i]=i;
aa[i].value=0.0;
}
for(int i=0;i<n;++i){
scanf("%lf%lf",&leftt[i],&rightt[i]);
}
int k=0;
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
if(i!=j)
{aa[k].value=sqrt((leftt[i]-leftt[j])*(leftt[i]-leftt[j])+(rightt[i]-rightt[j])*(rightt[i]-rightt[j]));
aa[k].x=i;
aa[k].y=j;
k++;
}
}
}
sort(r,r+k,cmp);
double sum=0;
for(int i=0;i<k;++i){
int e=r[i];
int x=find(aa[e].x);
int y=find(aa[e].y);
if(x!=y){
sum+=aa[e].value;
father[x]=y;
}
}
printf("%.2lf\n",sum);
}
return 0;
}
381

被折叠的 条评论
为什么被折叠?



