// krusal
算法根据
MST
性质。若点集合
U ~
点集合
V
存在一点最短路径
s~t,
则最小生成树必包含
s~t
这条路。
//
利用反证法(或者剪贴法)可以证明
// krusal
算法是将整个图每个顶点看成一个集合。主要是合并集合,直到只剩一个集合为止
//
这里主要以集合为考虑对象
有向图
// 用集合去找最小边
#include
"stdafx.h"
#include
<iostream>
#include
<vector>
#include
<list>
enum
{
Vertex_No_Connection
= -1,
Vertex_Total_Number
= 5,
Vertex_Max_Edge_Value
= 10000,
Vertex_No_In_Set
= 0,
Vertex_In_Set
= 1,
};
int
arrayPathScheme
[
Vertex_Total_Number
][
Vertex_Total_Number
] =
{
0, 10, -1, 30, 100,
-1, 0, 50, -1, -1,
-1, -1, 0, -1, 10,
-1, -1, 20, 0, 60,
-1, -1, -1, -1, 0,
};
//
顶点
V0 ~
其他顶点的排序
//
顶点
V1 ~
其他顶点的排序
// V2
,
V3
,
V4
std
::
list
<
int
>
listVertexEdgeSortSet
[
Vertex_Total_Number
];
struct
SVertexSet
{
int
idVertexSet
;
//
集合
ID
每个
ID
为唯一值,唯一标识这个集合
std
::
vector
<
int
>
vecVetexSet
;
//
当前顶点的集合
int
nSourceVertex
;
//
在该集合内
int
nMinEdgeToOtherSet
;
int
nDestVertex
;
SVertexSet
*
pNextDestVetex
;
SVertexSet
(
int
nVertexIndex
)
{
pNextDestVetex
=
NULL
;
nSourceVertex
=
nVertexIndex
;
idVertexSet
=
nVertexIndex
;
nDestVertex
=
Vertex_No_Connection
;
vecVetexSet
.
push_back
(
nVertexIndex
);
nMinEdgeToOtherSet
=
Vertex_Max_Edge_Value
;
if
( !
listVertexEdgeSortSet
[
nVertexIndex
].
empty
() )
{
int
nDestIndex
=
listVertexEdgeSortSet
[
nVertexIndex
].
back
();
nDestVertex
=
nDestIndex
;
nMinEdgeToOtherSet
=
arrayPathScheme
[
nVertexIndex
][
nDestVertex
];
}
}
};
std
::
list
<
SVertexSet
*>
listVertexSet
;
//
数组预处理处理回环的值
i -> j = 50
同时
j -> i = 30.
//
注销回环。则将
i -> j = 50
改为
i -> j = -1.
void
arrayInit
()
{
for
(
int
i
= 0;
i
<
Vertex_Total_Number
- 1; ++
i
)
{
for
(
int
j
=
i
+ 1;
j
<
Vertex_Total_Number
; ++
j
)
{
if
(
arrayPathScheme
[
i
][
j
] > 0 &&
arrayPathScheme
[
j
][
i
] > 0 )
{
if
(
arrayPathScheme
[
i
][
j
] <
arrayPathScheme
[
j
][
i
] )
arrayPathScheme
[
j
][
i
] = -1;
else
arrayPathScheme
[
i