《最小生成树》hdoj 1162 kruskal+优先队列

#include<iostream>
#include<cstdio>
#include<math.h>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std; int pre[105]; struct node { int x,y; double dist; friend bool operator < (const node &a,const node &b) { return a.dist>b.dist; } }; int find(int x) { int r=x,i=x,j; while(r!=pre[r])
        r=pre[r]; while(pre[i]!=r) {
        j=pre[i];
        pre[i]=r;
        i=j; } return r; } void mix(int x,int y) { int fx,fy;
    fx=find(x);
    fy=find(y); if(fx!=fy)
        pre[fy]=fx; } int main() { int n,i,j,a,b,m,sum; double cost; double x[105],y[105];
    node st;
    priority_queue<node>que; while(scanf("%d",&n)!=EOF) {
        cost=0;
        sum=0; for(i=1;i<=n;i++) {
            scanf("%lf%lf",&x[i],&y[i]);
            pre[i]=i; } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i!=j) {
                    st.x=i;
                    st.y=j;
                    st.dist=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
                    que.push(st); } } }
        m=n*n-n; while(!que.empty()) {
            st=que.top();
            que.pop();
            a=find(st.x);
            b=find(st.y); if(a!=b) {
                cost+=st.dist;
                sum++;
                mix(a,b); } if(sum==n-1) break; } while(!que.empty()) {
            que.pop(); }
        printf("%.2lf\n",cost); } return 0; }

你可能感兴趣的:(《最小生成树》hdoj 1162 kruskal+优先队列)