#include<iostream>
#include<queue>
#include<math.h>
using namespace std;
int father[101];
int fine(int x)//压缩,只用压缩时间320
{
int r=x,j;
while(father[r]>0)
r=father[r];//r是根
while(r!=x)
{
j=father[x];
father[x]=r;
x=j;
}
return r;
}
void weightmerge(int x,int y)//只用折叠时间为280//折叠压缩一起用260
{
int temp;
int ix,iy;
ix=fine(x);
iy=fine(y);
temp=father[ix]+father[iy];
if(ix!=iy)
if(father[ix]>father[iy])//ix的结点少,以结点多的为父节点
{
father[iy]=temp;
father[ix]=iy;//iy为父指针
}
else
{
father[ix]=temp;
father[iy]=ix;//ix为父指针
}
}
struct edge
{
double st,end;
double weight;
friend bool operator < (edge a,edge b)
{
return a.weight>b.weight;
}
};
priority_queue<edge> que;
double Kruskal();
int num;
int main()
{
bool flag=false;
int icase=1;
edge city[101];
while(cin>>num)
{
int i,j,ci=1;
if(!num)
break;
for(i=1;i<=num;i++)
{
cin>>city[ci].st>>city[ci].end;
ci++;
}
for(i=1;i<=num;i++)
father[i]=-1;
edge aedge;
while(!que.empty())
que.pop();
for(i=1;i<=num;i++)
for(j=i+1;j<=num;j++)
{
aedge.st=i;
aedge.end=j;
aedge.weight=(city[i].st-city[j].st)*(city[i].st-city[j].st)
+(city[i].end-city[j].end)*(city[i].end-city[j].end);
que.push(aedge);
}
cout.setf(ios::fixed);
cout.precision(2);
if(flag)
cout<<endl;
flag=true;
cout<<"Case #"<<icase++
<<":"<<endl<<"The minimal distance is: "
<<Kruskal()<<endl;
}
}
double Kruskal()
{
int Account=0;
double sum=0;
edge temp;
while(!que.empty()&&Account!=num)
{
temp=que.top();
que.pop();
if(fine(temp.st)!=fine(temp.end))//不成环
{
weightmerge(temp.st,temp.end);
if((-father[fine(temp.st)])>Account)
Account=0-father[fine(temp.st)];
sum+=sqrt(temp.weight);
}
}
return sum;
}
zoj1203-Swordfish(Kruskal实现)
最新推荐文章于 2015-08-13 20:50:42 发布