Saturday 5 May 2012

UVa 10034 Problem A: Freckles Solution

#include<iostream>
#include<list>
#include<string>
#include<cstring>
#include<sstream>
#include<cctype>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<stack>
#include<fstream>
#include<cstdlib>
#include<vector>
#include<map>
#include<utility>
#include<iomanip>
#include<queue>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
#define fill(a,v) memset(a,v,sizeof(a))
#define PB push_back
#define pi acos(-1.0)
#define eps 1e-9
int P[100+5],rank[100+5];
double arrx[100+5],arry[100+5];

struct Node{
    int a,b;
    double c;
    bool operator < (const Node &p) const{
    return c>p.c;
    }
};

int FIND(int x)
{
    if(x==P[x]) return x;
    else
    return P[x]=FIND(P[x]);
}

void UNION(int a,int b)
{
    if(rank[a]<rank[b])
        P[a]=FIND(b);
    else
    {
        P[b]=FIND(a);
        if(rank[a]==rank[b])
        rank[a]++;
    }
}
Node nd;

int main()
{
    int tc,i,j,n,cnt,A,B,PA,PB;
    double Cost,Tcost;
    priority_queue<Node>pq;
    cin>>tc;
    while(tc--)
    {
        cin>>n;
        cnt=0;
        Tcost=0;
        while(!pq.empty())
        pq.pop();
        for(i=0;i<n;i++)
            {
                cin>>arrx[i]>>arry[i];
                P[i]=i;
                rank[i]=0;
            }

        for(i=0;i<n;i++)
            for(j=i+1;j<n;j++)
                {
                    Cost=sqrt((arrx[j]-arrx[i])*(arrx[j]-arrx[i])+(arry[j]-arry[i])*(arry[j]-arry[i]));
                    nd.a=i;
                    nd.b=j;
                    nd.c=Cost;
                    pq.push(nd);
                }

        while(!pq.empty())
            {
                if(cnt==n-1) break;
                A=pq.top().a;
                B=pq.top().b;
                Cost=pq.top().c;
                PA=FIND(A);
                PB=FIND(B);
                if(PA!=PB)
                    {
                        Tcost+=Cost;
                        cnt++;
                        UNION(PA,PB);
                    }
                pq.pop();

            }

    printf("%.2lf\n",Tcost);
    if(tc)
    cout<<endl;

    }
return 0;
}

No comments:

Post a Comment