• hdu 1233 最小生成树


    1. /***********************************************************************************************************************
    2. map 存路径,值为权值; weight保存个点到源起点的权值; pre保存结点的前驱,即与源起点有路的下一个点
    3. length 生成的最短距离 point 图上共有多少点 sign该点是否已经找过
    4. 算法prim:
    5. 从一个结点的子图开始构造生成树:选择连接当前子图和子图外结点的最小权边,将相应结点和边加入子图,直至将所有结点加入子图
    6. ***********************************************************************************************************************/
    7. #include <stdio.h>
    8. #include <string>
    9. #define SIZE 1100
    10. #define INF 0x7fffffff
    11. int map[1100][1100], weight[1100], pre[1100], length, point;
    12. bool sign[1100];
    13. void prim(int weight[],int map[][SIZE], int pre[], bool sign[], int &length, int point_num, int source)
    14. { //source源起点,一定要是路径中有的
    15. for(int i=1; i<=point_num; i++) //这里的路径的标号都 > 1,记录所以点到源起点的权值,前驱,将该点置为已经查找
    16. {
    17. weight[i] = map[source][i];
    18. pre[i] = source; sign[i] = true;
    19. }
    20. sign[source] = false; length = 0;
    21. for(int i=1; i<point_num; i++) //枚举n-1个点,即n-1个通路
    22. {
    23. int min = INF, sign_node = i; //sign_node 记录找到的最小的下一个点
    24. for(int j=1; j<=point_num; j++) //查找最小权值的路径
    25. {
    26. if(sign[j] && weight[j] < min)
    27. {min = weight[j]; sign_node = j;}
    28. }
    29. {sign[sign_node] = false; length += min; } //找到点置为已找到,长度相加,
    30. //可以在这里添加一个标记,使他值等于min,如果最后值等于最大值,则不能生成最小生成树
    31. for(int j=1; j<=point_num; j++) //重新设定源起点,将剩下的未找的点加入
    32. {
    33. if(weight[j] > map[sign_node][j] && sign[j] )
    34. {weight[j] = map[sign_node][j]; pre[j] = sign_node;}
    35. }
    36. }
    37. }
    38. void input(int n, int map[][SIZE])
    39. {
    40. for(int i=1; i<=n ;i++)
    41. {
    42. int a, b, c;
    43. scanf("%d%d%d", &a, &b, &c);
    44. map[a][b] = c; map[b][a] = c;
    45. }
    46. }
    47. int main()
    48. {
    49. int N;
    50. while(~scanf("%d", &N) && N )
    51. {
    52. //scanf("%d", &M);
    53. //int map[1100][1100], weight[1100], pre[1100], length, point;
    54. //bool sign[1100];
    55. for(int i=0; i<=N; i++) //初始化,N是端点个数
    56. {
    57. weight[i] = INF; pre[N] = 0;
    58. for(int j=0; j<=N; j++)
    59. map[i][j] = INF;
    60. }
    61. memset(sign, false, sizeof(sign) );
    62. length = point = 0;
    63. input( N*(N-1)/2, map);
    64. prim(weight, map, pre, sign, length, N, 1); //查找,注意这个1 它是源起点,一定要是在路径上已知的点
    65. printf("%d ", length);
    66. }
    67. return 0;
    68. }
    69. /*
    70. Problem Description
    71. 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
    72. Input
    73. 测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
    74. 当N为0时,输入结束,该用例不被处理。
    75. Output
    76. 对每个测试用例,在1行里输出最小的公路总长度。
    77. Sample Input
    78. 3
    79. 1 2 1
    80. 1 3 2
    81. 2 3 4
    82. 4
    83. 1 2 1
    84. 1 3 4
    85. 1 4 1
    86. 2 3 3
    87. 2 4 2
    88. 3 4 5
    89. 0
    90. Sample Output
    91. 3
    92. 5
    93. */





    附件列表

    • 相关阅读:
      用一次就会爱上的cli工具开发
      npm与package.json快速入门
      检查服务器端口状态
      浅谈数据库用户表结构设计
      CAP 定理的含义
      蓝绿部署、金丝雀发布(灰度发布)、A/B测试
      Dockerfile多阶段构建原理和使用场景
      Dockerfile 中的 CMD 与 ENTRYPOINT
      maven全局配置文件settings.xml详解
      Linux之根目录说明
    • 原文地址:https://www.cnblogs.com/sober-reflection/p/5e68cd23427f47403e83f66013d4f7b7.html
    Copyright © 2020-2023  润新知