1162Eddy's picture

本文详细介绍使用Prim算法求解最小生成树的过程,通过计算点之间的距离并存储在邻接矩阵中,实现了一次通过的高效算法。文章提供了完整的C++代码实现,包括节点间距离的计算、Prim算法的具体步骤及输出结果。

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

一次通过,刚学prim的时候做过一道类似的,将每个点之间的距离保存在double型的邻接矩阵里,然后调用prim
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstring>
#include <cmath>
using namespace std;
#ifndef ONLINE_JUDGE
#include <fstream>
ifstream fin("test.txt");
#define cin fin
#endif
double graph[110][110];
const int INF = 1000000;
double dist(double a, double b, double c, double d)
{
    return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
double prim(int n)
{
    double lowcost[110],sum = 0;
    bool used[110];
    memset(used,0,sizeof(used));
    int i,j,k;
    for(i = 1; i <= n; ++i)
    lowcost[i] = graph[i][1];
    used[1] = 1;
    for(i = 1; i < n; ++i)
    {
        double min = INF;
        k = 1;
        for(j = 2; j <= n; ++j)
        {
            if(lowcost[j] < min && !used[j])
            {
                k = j;
                min = lowcost[j];
            }
        }
        used[k] = 1;
        sum += lowcost[k];
    //    sum += min;   搞不懂为什么这么写会错,输出变成了10000003.41 
        //明白了,输出1000003.41是因为i循环哪里多了一个等号,循环了n次,事实上只用n-1次
        for(j = 2; j <= n; ++j)
        if(graph[k][j] < lowcost[j] && !used[j])
        lowcost[j] = graph[k][j];
    }
    return sum;
}
int main()
{
    ios::sync_with_stdio(false);
    int n,i,j;
    double x[110],y[110];
    while(cin >> n)
    {
        for(i = 1; i <= n; ++i)
        cin >> x[i] >> y[i];
        for(i = 1; i <= n; ++i)
        for(j = 1; j <= n; ++j)
        graph[i][j] = dist(x[i],y[i],x[j],y[j]);
        cout <<fixed << setprecision(2) << prim(n) << endl;
    }
    return 0;
}
View Code

 

 
 

转载于:https://www.cnblogs.com/fchx/archive/2013/05/23/3097585.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值