最小生成树之prim

现在来补发之前c++作业的总结,不得不说,那次作业确实有点难顶,涉及到复杂的算法,好在洛谷社区有模板套,现在来削微总结下算法,尽管现在能理解算法背后的原理,但还是写不出算法,趁现在还记得这件事先记录下,日后经验丰富后再来回顾

代码如下

#include <bits/stdc++.h>
using namespace std;
double book[100], dis[100], MAX = 99999, maps[100][100];
vector<double> length(0);
// vector<double> ttt(0);
class point
{
private:
    double x, y;

public:
    double getx() const { return x; }
    double gety() const { return y; }
    void set()
    {
        cin >> x >> y;
    }
};
double calc(point p1, point p2)
{
    double l1, l2;
    l1 = (p1.getx() - p2.getx()) * (p1.getx() - p2.getx());
    l2 = (p1.gety() - p2.gety()) * (p1.gety() - p2.gety());
    return sqrt(l1 + l2);
}

int main()
{
    int n = 5, m = 10, i, j;
    int min, minIndex;
    double sum = 0;
    vector<point> pp(6);
    for (int i = 1; i <= 5; i++)
    {
        pp[i].set();
    }
    // 对maps初始化,除了自己到自己距离是0,其他都是边界值
    for (i = 1; i <= n;i++)
    {
        for (j = 1; j <= n;j++)
        {
            if(i != j)
                maps[i][j] = MAX;
            else
                maps[i][j] = 0;
        }
    }
    // 输入数据,输入无向图
    for (int i = 1; i < 6;i++)
    {
        for (int j = i + 1; j < 6;j++)
        {
            double temp = calc(pp[i], pp[j]);
            length.push_back(temp);
            maps[i][j] = temp;
            maps[j][i] = temp;
        }
    }
    // 初始化距离数组,默认把离1最近的找出来储存起来
    for (i = 1; i <= n; i++)
        dis[i] = maps[1][i];
    book[1] = 1;
    for (i = 1; i <= n - 1; i++)
    {
        min = MAX;
    // 对最小值复制,寻找离树最近的点
        for (j = 1; j <= n; j++)
        {
            if (book[j] == 0 && dis[j] < min)
            {
                min = dis[j];
                minIndex = j;
            }
        }
        // 标记这个点被访问过
        book[minIndex] = 1;
        sum += dis[minIndex];
        for (j = 1; j <= n; j++)
        {
        // 如果这个点没被访问过,如果距离更近就更新
            if (book[j] == 0 && maps[minIndex][j] < dis[j])
                dis[j] = maps[minIndex][j];
        }
    }
    cout.setf(ios::fixed);
    cout << setprecision(6) << sum << endl;
    cout << endl;
    // 输出最小生成树
}

快速理解原理:2分钟搞懂最小生成树prim算法_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

题解模板:P3366 【模板】最小生成树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) (有很多模板,选择适合自己,能看懂的为上策)