• 克鲁斯卡尔算法(C++)


    目录

     克鲁斯卡尔算法

    ​编辑代码:

    结果:

     克鲁斯卡尔算法

    克鲁斯卡尔算法是一种用于求解最小生成树的算法。最小生成树是指一棵包含了所有节点的连通图,并且边的权值之和最小。

    克鲁斯卡尔算法的基本思想是,每次选择图中最小的边,如果这条边的加入不会形成环,则将它加入最小生成树中。重复以上过程,直到所有节点都被纳入最小生成树中。

    具体实现时,可以使用并查集来判断加入一条边是否会形成环。在实现过程中,需要先对边按照权值进行排序,然后遍历每条边进行判断。

    代码:

    1. #include
    2. #include
    3. using namespace std;
    4. typedef int vertextype;
    5. typedef struct node
    6. {
    7. vertextype head;//边起始点
    8. vertextype tail;//边终点
    9. int w;//权值
    10. }edge;
    11. bool cmp(edge a, edge b)//权值小的排前面
    12. {
    13. return a.w < b.w;
    14. }
    15. int main()
    16. {
    17. edge e[100];
    18. int n, t, vexset[100];//顶点数、边数、连通分量
    19. cout << "输入顶点数和边数";
    20. cin >> n >> t;
    21. for (int i = 1; i <= n; i++)//初始化连通分量
    22. {
    23. vexset[i] = i;
    24. }
    25. cout << "输入边:" << endl;
    26. for (int i = 0; i < t; i++)
    27. {
    28. int v1, v2, w;
    29. cin >> v1 >> v2 >> w;
    30. e[i].head = v1;
    31. e[i].tail = v2;
    32. e[i].w = w;
    33. }
    34. sort(e, e + t, cmp);
    35. int sum = 0;
    36. cout << "输出最小生成树:" << endl;
    37. for (int i = 0; i < t; i++)
    38. {
    39. int v1, v2;
    40. v1 = e[i].head;
    41. v2 = e[i].tail;
    42. int vs1 = vexset[v1];//取v1连通分量
    43. int vs2 = vexset[v2];//取v2连通分量
    44. if (vs1 != vs2)
    45. {
    46. sum += e[i].w;
    47. cout << v1 << " " << v2 << endl;
    48. for (int j = 1; j <= n; j++)//更新连通分量
    49. {
    50. if (vexset[j] == vs2)
    51. vexset[j] = vs1;
    52. }
    53. }
    54. }
    55. cout << "最小生成树权值:"<
    56. }

    结果:

  • 相关阅读:
    40年糖尿病史的老太太都能成功逆转糖尿病
    包装类知识点
    使用DevExpress的绑定导航
    shell编程之命令替换
    在React中传递onFocus事件的参数
    搜索与图论:染色法判别二分图
    SQL进阶day12——空值处理
    # LoongArch 内存模型与栅障
    【JVM】双亲委派模型
    机器学习算法——集成学习
  • 原文地址:https://blog.csdn.net/qq_74156152/article/details/134447932