zju1203最小生成树(克鲁斯卡尔算法)

来源:互联网 发布:天然工坊系统源码 编辑:程序博客网 时间:2024/06/05 17:30
#include <iostream>#include <cstdio>using namespace std;#include<cmath>#include<iomanip>#include<algorithm>#define N 105int n,b[N*(N-1)/2],k;double a[N][2];struct point {double d;int x,xx;}p[N*(N-1)/2];bool cmp(point a,point b){ return a.d<b.d;}void init(){for(int i=1;i<=n;i++)b[i]=i;} int find (int x){if(b[x]==x) return x;return b[x]=find(b[x]);}void merge(int x,int y){int ta=find(x),tb=find(y);if(ta!=tb) b[ta]=tb;}double kus(){int u,v,i,s=0;double ans=0;init();for(i=0;i<k;i++){u=p[i].x;v=p[i].xx;if(find(u)!=find(v)){ans+=p[i].d;merge(u,v);s++;}if(s==n-1) return ans;}}int main(){       int i,j,m=0,flag=0;    double ans;    while(cin>>n&&n){k=0;for(i=1;i<=n;i++)cin>>a[i][0]>>a[i][1];for(i=1;i<=n;i++)for(j=i;j<=n;j++)  (j==i哦,当n==1的时候有用)      {p[k].x=i;p[k].xx=j;p[k++].d=sqrt((a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1]));}sort(p,p+k,cmp);    if(flag==0) {cout<<"Case #"<<++m<<':'<<endl<<"The minimal distance is: "<<fixed<<setprecision(2)<<kus()<<endl;flag=1;}else {cout<<endl<<"Case #"<<++m<<':'<<endl<<"The minimal distance is: "<<fixed<<setprecision(2)<<kus()<<endl;}}return 0;}

原创粉丝点击