2019年春季个人训练赛第一场(老生场)-D

本文深入探讨了最小生成树算法的实现,通过具体代码展示了如何使用优先级队列和并查集来解决实际问题,包括节点间的距离计算、边的选择以及最小生成树的构建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://blog.youkuaiyun.com/vocaloid01/article/details/76559746

别人随便一写,就是我半年,甚至一年的积累。什么时候能轻松地写出这么思路清晰的代码呀?

个人不足:

1,优先级队列的结构体用法

2,最小生成树简介版本

3,并查集

4,结构体 构造函数

5,重载运算符 operator

#include<bits/stdc++.h>
using namespace std;

double maps[105][2];
struct D
{
    double len;
    int head,tail;
    D(int a,int b,double l)
    {
        head=a;  tail=b;
        len=l;
    }
};
struct cmp
{
    bool operator() (D a,D b)
    {
        return a.len>b.len;
    }

};
int pre[105];
int find(int a)
{
    if(pre[a]==a){return a;}
    return pre[a]=find(pre[a]);
}

 bool judge(int a,int b)
{
    int A=find(a);
    int B=find(b);
    if(A!=B)
    {
        pre[A]=B; return 1;
    }
    else
        return 0;
}


int main()
{
    int n;
    int key=1;
    while(cin>>n && n!=0)
    {
        for(int i=0;i<n;i++)
            cin>>maps[i][0]>>maps[i][1];
        priority_queue<D ,vector<D>,cmp > Q;
        double len;
        for(int i=0;i<n;i++)
            for(int j=i+1;j<n;j++)
        {
           len=sqrt( pow(maps[i][0]-maps[j][0],2)+pow(maps[i][1]-maps[j][1],2) );
            Q.push( D(i,j,len) );
        }

        for(int i=0;i<n;i++) pre[i]=i;
        double length=0;
        int edge=0;
        while(edge<n-1)
        {
          D  mid=Q.top();
            Q.pop();
            if(judge(mid.head,mid.tail ) )
            {
                edge++;
                length+=mid.len;
            }
        }

        printf("Case #%d:\n",key);
        printf("The minimal distance is: %.2f\n\n",length);
        key++;


    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值