您的位置:首页 > 其它

zoj_1203 Swordfish

2013-05-23 23:51 363 查看
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=203

 

//C++代码
#include<iostream>
#include<iomanip>
#include<queue>
#include<cmath>
using namespace std;

struct Edge{
int u,v;
double w;
bool operator <(const Edge a) const{
return w>a.w;
}
}edge;

int n,t=0,s[105];
priority_queue<Edge> pq;

double dist(double x1,double y1,double x2,double y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

void Union(int x,int y){
s[y]=x;
}

int Find(int x){
if(s[x]<0) return x;
return s[x]=Find(s[x]);
}

void Kruskal(){
int num=0,i;
double sum=0;
for(i=1;i<=n;i++) s[i]=-1;
while(!pq.empty() && num<n-1){
edge=pq.top();
pq.pop();
if(Find(edge.u)!=Find(edge.v)){
Union(Find(edge.u),Find(edge.v));
sum+=edge.w;
num++;
}
}
if(++t!=1) cout<<endl;
cout<<"Case #"<<t<<":"<<endl;
cout<<"The minimal distance is: "<<fixed<<setprecision(2)<<sum<<endl;
while(!pq.empty()) pq.pop();
}

int main(){
while(cin>>n,n){
int i,j;
double x[105],y[105];
for(i=1;i<=n;i++) cin>>x[i]>>y[i];
for(i=1;i<n;i++){
for(j=i+1;j<=n;j++){
edge.u=i;
edge.v=j;
edge.w=dist(x[i],y[i],x[j],y[j]);
pq.push(edge);
}
}
Kruskal();
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  并查集 kruskal