1、基本原理。
算法图示:
2、实现。
//用以表示图中的边的结构体
struct Arc
{
unsigned start_; //起始顶点
unsigned end_; //终止结点
unsigned value_; //边的权值
Arc():
start_(-1),
end_(-1),
value_(unsigned(-1))
{
}
};
void transferGraphArray2ArcArray(unsigned graph[MAX_VERTEX][MAX_VERTEX],std::vector<Arc>& arcArray)
{
Arc temp;
for(int i=0;i<MAX_VERTEX;++i)
{
for(int j=MAX_VERTEX-1;j>=i;--j)
{
if(graph[i][j]!=unsigned(-1))
{
temp.start_=i;
temp.end_=j;
temp.value_=graph[i][j];
arcArray.push_back(temp);
}
}
}
}
bool compare(Arc a,Arc b)
{
return a.value_<b.value_?true:false;
}
bool findTwoNodeInDiffTree(unsigned u,unsigned v,std::vector<std::vector<unsigned>>& treeArray)
{
unsigned indexU=-1;
unsigned indexV=-1;
for(unsigned i=0;i<treeArray.size();++i)
{
if(std::find(treeArray[i].begin(),treeArray[i].end(),u)!=treeArray[i].end())
indexU=i;
if(std::find(treeArray[i].begin(),treeArray[i].end(),v)!=treeArray[i].end())
indexV=i;
}
if(indexU!=indexV)
{
for(unsigned i=0;i<treeArray[indexV].size();++i)
{
treeArray[indexU].push_back(treeArray[indexV][i]);
}
treeArray[indexV].clear();
return true;
}
return false;
}
//最小生成树之——kruskal算法
void kruskalAlgorithm(unsigned graph[MAX_VERTEX][MAX_VERTEX])
{
std::vector<Arc> arcArray;
transferGraphArray2ArcArray(graph,arcArray);
std::sort(arcArray.begin(),arcArray.end(),compare);
std::vector<std::vector<unsigned>> treeArray(MAX_VERTEX);
//各个顶点自己独立构成一棵树
for(int i=0;i<MAX_VERTEX;++i)
{
treeArray[i].push_back(i);
}
for(unsigned i=0;i<arcArray.size();++i)
{
unsigned indexU=arcArray[i].start_;
unsigned indexV=arcArray[i].end_;
if(findTwoNodeInDiffTree(indexU,indexV,treeArray))
{
std::cout<<"eadge add: "<<indexU<<"----------"
<<arcArray[i].value_<<"---------->"<<indexV;
std::cout<<std::endl;
}
}
}
//测试函数
int main()
{
kruskalAlgorithm(graph);
return 0;
}
3、运行截图,
参考:
[1].https://blog.csdn.net/luoshixian099/article/details/51908175