Kruskal克鲁斯卡尔最小生成树算法(贪心算法)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Kruskal克鲁斯卡尔最⼩⽣成树算法(贪⼼算法)
1. /*
2. * Introduction to Algorithms
3. * Chapter 23 --- MST.Kruskal
4. * Tanky Woo @
5. * 2012.1.7
6. */
7.
8. #include <</span>iostream>
9. #include <</span>algorithm>
10. using namespace std;
11.
12. const int maxint = 999999;
13.
14. typedef struct Road{
15. int c1, c2;// a到b
16. int value;//权值
17. }Road;
18.
19. int no;
20. int line;//记录实际关系数
21. Road road[100];//设⼀个⽐较⼤的值,实际看输⼊最⼩⽣成树中:边数e=n-1
22. int node[101];//最⼩⽣成树:n顶点数
23.
24. bool myCmp(const Road &a,const Road &b)
25. {
26. if(a.value <</span> b.value)
27. return 1;
28. return 0;
29. }
30.
31. //node[2]=1 node[8]=1 ,node[3]=1,共同的祖先,如果(3,8)加进去,则构成回路,不要
32. //有点像并查集
33. int Find_Set(int n)
34. {
35. if(node[n]==-1)
36. return n;
37. return node[n]= Find_Set(node[n]);
38. }
39.
40. bool Merge(int s1,int s2)
41. {
42. int r1 = Find_Set(s1);
43. int r2 = Find_Set(s2);
44. if(r1 == r2)//如果相等证明构成回路,则直接返回⼀个0,不要把顶点加进来(下⼀步是加进去的)
45. return 0;
46. if(r1 <</span> r2)
47. node[r2]= r1;
48. else
49. node[r1]= r2;
50. return 1;
51. }
52.
53. int main()
54. {
55. freopen("input.txt","r", stdin);
56. //初始化全为-1
57. memset(node,-1, sizeof(node));
58. scanf("%d",&no);
59. scanf("%d",&line);
60. int i;
61. for(i=0; i<</span>line; ++i)
62. {
63. cin >> road[i].c1 >> road[i].c2 >> road[i].value;
64. }
65. sort(road, road+line, myCmp);
66. int sum = 0, count = 0;// sum是MST的值,count是记录已使⽤的点数
67. for(i=0; i<</span>line; ++i)
68. {
69. if(Merge(road[i].c1, road[i].c2))//如果返回的为0,则证明构成回路,不要加进
70. {
71. count ++;
72. sum += road[i].value;
73. }
74. if(count == no-1)//e=n-1已经连通,可以退出
75. break;
76. }
77. cout <</span><</span> sum <</span><</span> endl;
78. return 0;
79. }
80.
81.
82. /*
83. input.txt:
84. 9
85. 14
86. 1 2 4
87. 1 8 8
88. 2 3 8
89. 2 8 11
90. 3 4 7
91. 3 6 4
92. 3 9 2
93. 4 5 9
94. 4 6 14
95. 5 6 10
96. 6 7 2
97. 7 8 1
98. 7 9 6
99. 8 9 7
100. */。

相关文档
最新文档