`

Uva 10397 - Connect the Campus

    博客分类:
  • Uva
阅读更多
题目来源:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=116&problem=1338&mosmsg=Submission+received+with+ID+8905555

题目大意:见代码
题目分析:见代码
//Uva  10397 - Connect the Campus
//给定一些点及一些边,通过添加最少长度的线段使之所有点均连通
//并查集的应用
//先求出各连通分量
//再求出各个连通分量距其它连通分量的最短距离
//再求缩点后的最小生成树
#include <iostream>
#include <cmath>
#include <vector>
#include <iomanip>
#include <algorithm>
#define INF 200000000.0
using namespace std;
const int maxn=800;
struct point
{
    double x;
    double y;
    point(double a=0.0,double b=0.0):x(a),y(b){}
}p[maxn];
struct node
{
    int v1;
    int v2;
    double d;
    node(int a=0,int b=0,double c=0.0):v1(a),v2(b),d(c){}
};
bool cmp(node a,node b)
{
    return a.d<b.d;
}
double dis(point p1,point p2)
{
    double x=p2.x-p1.x;
    double y=p2.y-p1.y;
    return sqrt(x*x+y*y);
}
int n;//顶点数量
int father[maxn],rank[maxn];//用于并查集
vector<vector<int> > v;//存储每一个连通分量的顶点
vector<node> d;//存储任意两个连通分量间的最短距离
//并查集部分
void make_set(int x)
{
    father[x]=x;
    rank[x]=1;
}
int find(int x)
{
    if(x!=father[x])     father[x]=find(father[x]);
    return father[x];
}
int Union(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y)    return 0;
    if(rank[x]<rank[y])     father[x]=y;
    else    if(rank[x]==rank[y])    {father[x]=y;rank[y]++;}
    else    father[y]=x;
    return 1;
}
double cal(int a,int b)
{
    double minv=INF;
    int len1=v[a].size();
    int len2=v[b].size();
    for(int i=0;i<len1;i++)
    {
        for(int j=0;j<len2;j++)
        {
            minv=min(minv,dis(p[v[a][i]],p[v[b][j]]));
        }
    }
    return minv;
}
int main()
{
    while(cin>>n)
    {
        for(int i=1;i<=n;i++)
        {
            cin>>p[i].x>>p[i].y;
            make_set(i);
        }
        int m,a,b;
        cin>>m;
        for(int i=0;i<m;i++)
        {
            cin>>a>>b;
            Union(a,b);
        }
        v.assign(n+1,vector<int>());
        int e=0;
        for(int i=1;i<=n;i++)
        {
            int x=find(i);
            if(v[x].size()==0)  e++;
            v[x].push_back(i);
        }
        d.clear();
        for(int i=1;i<=n;i++)
        {
            if(v[i].size()==0)  continue;
            for(int j=i+1;j<=n;j++)
            {
                if(v[j].size()==0)  continue;
                double r=cal(i,j);
                d.push_back(node(i,j,r));
            }
        }
        sort(d.begin(),d.end(),cmp);
        double sum=0.0;
        for(int i=1;i<=n;i++)
        {
            make_set(i);
        }
        for(int i=0;i<d.size();i++)
        {
            node r=d[i];
            if(Union(r.v1,r.v2))    sum+=d[i].d;
        }
        cout<<fixed<<setprecision(2)<<sum<<endl;
    }
    return 0;
}

分享到:
评论

相关推荐

    UVaOJ-401(Palindromes).zip_401 Palindromes

    标题中的"UVaOJ-401(Palindromes)"表明这是一个关于解决UVa Online Judge(UVa OJ)上编号为401的编程挑战,该挑战的主题是"Palindromes",即回文串。回文串是指一个字符串无论从前读到后还是从后读到前都是相同的,...

    Uva 1510 - Neon Sign

    ### Uva 1510 - Neon Sign #### 问题背景与描述 在题目“Uva 1510 - Neon Sign”中,我们面对的是一个霓虹灯招牌设计问题。该霓虹灯招牌由一系列位于圆周上的角点组成,并通过发光管连接这些角点。发光管有两种...

    uva705-Slash-Maze-.rar_Slash_uva705

    【标题】"uva705-Slash-Maze-.rar_Slash_uva705" 指向的是一个在UVa Online Judge (UVa OJ) 上提交并通过的编程问题,具体为问题编号705,名为"Slash Maze"。这个压缩包很可能包含了该问题的解决方案源代码。 ...

    UVA100~200---52道题accept代码,均顺利accept过

    4. **UVA152 - The Stock Maximal Sequence**:此题属于动态规划,要求找到股票价格序列中的最大收益。关键在于找到合适的状态转移方程,考虑买卖股票的最佳时机。 5. **UVA107 - Robot Walk**:该题考察图论和深度...

    开源项目-codingsince1985-UVa#uva-online-judge-solutions-in-golang.zip

    开源项目-codingsince1985-UVa#uva-online-judge-solutions-in-golang.zip,两年来每天都在解决一个uva在线裁判问题,算起来…

    UVA133-TheDoleQueue.zip_site:www.pudn.com_uva133

    《UVA133 - 救济金发放问题:The Dole Queue》 在计算机科学领域,算法是解决问题的关键工具,特别是在处理复杂数据结构和优化问题时。UVA(University of Virginia)在线判题系统提供了丰富的算法题目供程序员挑战...

    Algorithm-UVA-Solutions-in-Python.zip

    "Algorithm-UVA-Solutions-in-Python.zip"这个压缩包文件正是针对UVA竞赛中问题的Python 3解决方案集合。 Python作为一门易学且功能强大的编程语言,因其简洁的语法和丰富的库支持,成为了许多算法爱好者和开发者的...

    uva532-Dungeon-Master.rar_dungeon

    《UVA532 Dungeon Master:解密游戏编程的深度探索》 在计算机科学与编程领域,UVA(University of Virginia)在线判题系统是一个深受程序员喜爱的平台,它提供了丰富的算法题目供学习者挑战。其中,编号为532的...

    tpcw-nyu-uva-client 客户端

    "tpcw-nyu-uva-client 客户端"是一个专为TPCW(Transaction Processing Performance Council Workloads)设计的应用程序,由纽约大学(NYU)和弗吉尼亚大学(UVA)共同开发。这个客户端软件主要用于模拟和评估数据库...

Global site tag (gtag.js) - Google Analytics