标签:style blog http 使用 strong 数据
克鲁斯卡尔算法:辅助数组为:
3.第二次循环,会将3---5纳入生成树集合:
辅助数组为:
4.如此再循环两次:
辅助数组:
此时,再准备下次循环时,对应的是边集数组的第四组:
计算find(0)=5,find(3)=5,即m==n,形成了环,所以被舍去!直到遇到边集数组第六组时才不会形成环。最终生成树为:
实现:
/*******************************************
最小生成树之克鲁斯卡尔算法
by Rowandjj
2014/7/9
*******************************************/
#include<iostream>
using namespace std;
#define MAX_VERTEX_NUM 20//最大顶点数
typedef struct _EDGE_
{
int begin;//起始点序号
int end;//终点序号
int weight;//权值
}Edge[MAX_VERTEX_NUM];//边集数组
typedef struct _GRAPH_
{
Edge edge;//边集数组
int numVertiexs;//顶点数
int numEdges;//边数
}Graph;//图存储结构--->边集数组结构
//------------------------------------------
void CreateGraph(Graph* g);//构建有权无向图g
void Display(Graph g);//输出图g的相关信息
int Find(int *parent,int f);
void MiniSpanTree_Kruskal(Graph g);//最小生成树之克鲁斯卡尔算法
//------------------------------------------
void CreateGraph(Graph* g)
{
int i;
cout<<"输入顶点数、边数:";
cin>>g->numVertiexs;
cin>>g->numEdges;
cout<<"按权值从小到大顺序输入每条边的两个顶点及权值:"<<endl;
//初始化边集数组
for(i = 0; i < g->numEdges; i++)
{
cin>>g->edge[i].begin;
cin>>g->edge[i].end;
cin>>g->edge[i].weight;
}
}
void Display(Graph g)
{
cout<<"顶点数:"<<g.numVertiexs<<" 边数:"<<g.numEdges<<endl;
cout<<"打印各边信息:"<<endl;
for(int i = 0; i < g.numEdges; i++)
{
cout<<g.edge[i].begin<<"---->"<<g.edge[i].end<<" : "<<g.edge[i].weight<<endl;
}
}
int Find(int *parent,int f)
{
while(parent[f] > 0)
{
f = parent[f];
}
return f;
}
void MiniSpanTree_Kruskal(Graph g)//最小生成树之克鲁斯卡尔算法
{
int i;
int m,n;
int parent[MAX_VERTEX_NUM];//定义辅助数组,用来判断边与边之间是否存在环路
//1.初始化辅助数组
for(i = 0; i < g.numVertiexs; i++)
{
parent[i] = 0;
}
//2.计算最小生成树
for(i = 0; i < g.numEdges; i++)
{
n = Find(parent,g.edge[i].begin);
m = Find(parent,g.edge[i].end);
if(n != m)//如果没有形成c环,那么输出
{
parent[n] = m;//表示此顶点已经在生成树集合中
cout<<g.edge[i].begin<<"--->"<<g.edge[i].end<<" : "<<g.edge[i].weight<<endl;
}
}
}
//------------------------------------------
int main()
{
Graph g;
CreateGraph(&g);
Display(g);
cout<<"\n最小生成树如下\n"<<endl;
MiniSpanTree_Kruskal(g);
return 0;
}
测试:
标签:style blog http 使用 strong 数据
原文地址:http://blog.csdn.net/chdjj/article/details/37602723