题目信息:10034 - Freckles
本题主要考察最小生成树的生成问题,这里是用链表写的,可能没有用数组简便,但练练链表。题目并没有构造出最小生成树,可以用邻接数组来构造出最小生成树,再用bfs遍历出最小生成树。
#include<iostream>
#include<list>
#include<cmath>
#include<cstdio>
using namespace std;
//利用最小生成树解决问题
typedef struct node
{
double x;
double y;
}Node;
int main()
{
int n;
cin>>n;
cin.ignore();
while(n--)
{
int m,t;
double sum=0;
Node temp;
list<Node> ls1,ls2;
cin>>m;
for(t=0;t<m;t++)
{
cin>>temp.x>>temp.y;
ls1.push_back(temp);
}
ls2.push_back(ls1.front());
ls1.pop_front();
while(!ls1.empty())
{
double tMin=0x7fffffff,temp1;
list<Node>::iterator iter1,iter2,iter3;
for(iter2=ls2.begin();iter2!=ls2.end();++iter2)
{//每次找出距ls2集合中最近的点然后把该店从ls1中删除并加如ls2
for(iter1=ls1.begin();iter1!=ls1.end();++iter1)
{
temp1=pow((iter1->x-iter2->x),2)+pow(iter1->y-iter2->y,2);
if(tMin>=temp1)
{
iter3=iter1;
tMin=temp1;
}
}
}
sum+=sqrt(tMin);
temp.x=iter3->x;temp.y=iter3->y;
ls2.push_back(temp);
ls1.erase(iter3);
}
printf("%.2lf\n",sum);
//cout<<sum<<endl;
if(n>=1) cout<<endl;
ls2.clear();
}
return 0;
}