• 问题 B: 图的最小生成树-Kruskal算法


    题目描述

    Kruskal算法是最小生成树的经典算法,其步骤为:
    E1:将所有的边按权值排序;
    E2:设每个顶点为一个独立的点集,生成树T为空集;
    E3:依序扫描每一条边,直到已输出n-1条边:
    E31:若vi、vj不在同一点集中,则将该边加入生成树T中,并合并这两个点集;否则舍弃该边;
    本题要求读入带权图,对其所有边按权值排序后输出。

    输入格式

    输入为邻接矩阵存储的图,第一行为正整数n(小于100),表示图中顶点个数
    接下来是n行,每行为n个空格隔开的非负整数。0表示两个顶点之间没有直达边,非0表示有直达边。且该数字为对应直达边的权重。

    输出格式

    对所有边按权重排序后输出。如果图只有1个点(即没有边),则直接输出空行。

    输入样例

    1. 7
    2. 0 10 9 13 0 0 0
    3. 10 0 0 15 7 0 12
    4. 9 0 0 4 0 3 0
    5. 13 15 4 0 0 22 23
    6. 0 7 0 0 0 0 20
    7. 0 0 3 22 0 0 32
    8. 0 12 0 23 20 32 0

    输出样例  

    1. <2,5>:3
    2. <5,2>:3
    3. <3,2>:4
    4. <2,3>:4
    5. <4,1>:7
    6. <1,4>:7
    7. <2,0>:9
    8. <0,2>:9
    9. <1,0>:10
    10. <0,1>:10
    11. <1,6>:12
    12. <6,1>:12
    13. <0,3>:13
    14. <3,0>:13
    15. <1,3>:15
    16. <3,1>:15
    17. <4,6>:20
    18. <6,4>:20
    19. <3,5>:22
    20. <5,3>:22
    21. <6,3>:23
    22. <3,6>:23
    23. <5,6>:32
    24. <6,5>:32

    数据范围与提示

    注意题目的测试数据构造时用的排序算法如下:
    for(int i=0;i    for(int j=i+1;j         if(a[j]

    代码展示 

    1. #include
    2. #include
    3. using namespace std;
    4. struct side{
    5. int row;
    6. int col;
    7. int weight;
    8. };
    9. struct allSides{
    10. int num;
    11. side * sides;
    12. };
    13. bool operator <(const side &side1,const side &side2){
    14. return side1.weight
    15. }
    16. int main(){
    17. //freopen("/config/workspace/test/test","r",stdin);
    18. int n;
    19. cin>>n;
    20. allSides sss;
    21. sss.num=n*n;
    22. sss.sides=new side[n*n];
    23. int matrix[n][n];
    24. for(int i=0;i
    25. for(int j=0;j
    26. cin>>matrix[i][j];
    27. }
    28. if(n==1){
    29. cout<
    30. return 0;
    31. }
    32. int k=0;
    33. for(int i=0;i
    34. for(int j=0;j
    35. if(matrix[i][j]!=0){
    36. sss.sides[k].row=i;
    37. sss.sides[k].col=j;
    38. sss.sides[k].weight=matrix[i][j];
    39. k++;
    40. }
    41. }
    42. }
    43. //test
    44. // for(int i=0;i
    45. // cout<<"<"<:"<
    46. // }
    47. // cout<<"***************************"<
    48. int loc[k];
    49. for(int i=0;i
    50. loc[i]=i;
    51. for(int i=0;i
    52. for(int j=i+1;j
    53. if(sss.sides[loc[j]].weight
    54. int temp=loc[j];
    55. loc[j]=loc[i];
    56. loc[i]=temp;
    57. }
    58. }
    59. }
    60. for(int i=0;i
    61. cout<<"<"<","<">:"<
    62. }
    63. return 0;
    64. }

    //闲叙题外话:最近...的...睡眠...堪忧啊...

  • 相关阅读:
    Express的基本使用app.post()app.get()res.send()
    Web APIs——BOM和延迟函数setTimeout
    c++ 高效使用vector(面试)
    抖音获得抖音商品详情 API
    hibernate源码(1)--- schema创建
    95后阿里P7晒出工资单:狠补了这个,真香....
    蓝桥杯-平方和(599)
    CentOS yum安装jdk8
    数据库基本操作
    面试结束前被问「你有哪些要问我的?」该怎么办?这样回答你就凉了
  • 原文地址:https://blog.csdn.net/weixin_65908362/article/details/128086293