HDU-1875-畅通工程再续

//很简单的克鲁斯卡尔算法,注意细节就容易AC了//

AC代码:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 10000005
int p[N]; struct node { int x,y,z,z1,z2; double c; } t[N],T[N]; int n,cnt; int cmp(node p,node q) { return p.c<q.c; } int find(int k) { if(p[k]==k) { return p[k]; } else { return find(p[k]); } } double cl() { double sum=0; int s=0; for(int i=0; i<cnt; i++) { int X=find(T[i].z1); int Y=find(T[i].z2); if(X!=Y&&T[i].c>=10.000000&&T[i].c<=1000.000000) {
            p[Y]=X;
            s++;
            sum+=T[i].c; } if(s==n-1) { return sum; } } return -1; } int main() { int u;
    scanf("%d",&u); while(u--) {
        scanf("%d",&n); if(n==1||n==0) {
            printf("0\n"); } else { int i,j; for(i=0; i<=n; i++) {
                p[i]=i; } for(i=0; i<n; i++) {
                scanf("%d%d",&t[i].x,&t[i].y);
                t[i].z=i+1; }
            cnt=0; for(i=0; i<n; i++) { for(j=i+1; j<n; j++) { double d=sqrt((double)((t[j].x-t[i].x)*(t[j].x-t[i].x)+(t[j].y-t[i].y)*(t[j].y-t[i].y)));
                    T[cnt].c=d;
                    T[cnt].z1=t[i].z;
                    T[cnt].z2=t[j].z;
                    cnt++; } }
            sort(T,T+cnt,cmp); double s=cl(); if(s!=-1) { double o=s*100.0;
                printf("%0.1f\n",o); } else {
                printf("oh!\n"); } } } return 0; }

你可能感兴趣的:(HDU-1875-畅通工程再续)