//kruskal
#include<iostream>
#include<stdlib.h>
#include<malloc.h>
using namespace std;
#define TOPMAX 60000
#define MAX 100
//邻接矩阵
typedef struct _graph
{
char vexs[MAX];//顶点
int vexnum;//顶点数
int edgnum;//边数
int matrix[MAX][MAX];//保存矩阵的信息
}Graph,*PGraph;
//边的结构图
typedef struct _EdgeData
{
char start;
char end;
int weight;
}EData;
void CreateJuzhen(Graph &G)
{
int i, j = 0;
G.vexnum = 9;
for (i = 0; i < G.vexnum; i++)
{
G.vexs[i] = 65 + i;
cout << "i的值为:" << G.vexs[i] << endl;
}
G.vexs[G.vexnum] = '\0';
G.edgnum = 15;
for (i = 0; i < G.vexnum; i++)
{
for (j = 0; j < G.vexnum; j++)
{
if (i == j)
G.matrix[i][j] = 0;
else
G.matrix[i][j] = TOPMAX;
}
}
G.matrix[0][1] = 10;
G.matrix[0][5] = 11;
G.matrix[1][2] = 18;
G.matrix[1][8] = 12;
G.matrix[1][6] = 16;
G.matrix[2][8] = 8;
G.matrix[2][3] = 22;
G.matrix[3][8] = 21;
G.matrix[3][7] = 16;
G.matrix[3][4] = 20;
G.matrix[4][7] = 7;
G.matrix[4][5] = 26;
G.matrix[5][6] = 17;
G.matrix[6][7] = 19;
for (i = 0; i < G.vexnum; i++)
{
for (j = 0; j < G.vexnum; j++)
G.matrix[j][i] = G.matrix[i][j];
}
}
static int get_position(Graph G, char ch)
{
int i;
for (i = 0; i < G.vexnum; i++)
{
if (ch == G.vexs[i])
return i;
}
return -1;
}
void Print(Graph G)
{
int i, j;
for (i = 0; i < G.vexnum; i++)
{
for (j = 0; j < G.vexnum; j++)
cout << G.matrix[i][j] << " ";
cout << endl;
}
}
//获取图中的边
EData* get_edges(Graph G)
{
int i, j;
int index=0;
EData *edges = NULL;
edges = (EData *)malloc(G.edgnum * sizeof(EData));
if (NULL == edges)
{
cout << "error" << endl;
return NULL;
}
for (i = 0; i < G.vexnum; i++)
{
for (j = i + 1; j < G.vexnum; j++)
{
if (G.matrix[i][j] != TOPMAX)
{
edges[index].start = G.vexs[i];
edges[index].end = G.vexs[j];
edges[index].weight = G.matrix[i][j];
index++;
}
}
}
return edges;
}
//对边按照权值大小排序
void sorted_edges(EData *edges, int elen)
{
int i, j;
EData tmp;
for (i = 0; i < elen; i++)
{
for (j = i + 1; j < elen; j++)
{
if (edges[i].weight > edges[j].weight)
{
tmp = edges[i];
edges[i] = edges[j];
edges[j] = tmp;
}
}
}
}
//获取i的终点
int get_end(int vends[], int i)
{
if (i >= 0)
{
while (vends[i] != 0)
i = vends[i];
}
return i;
}
void kruskal(Graph G)
{
int i, m, n, p1, p2;
int length;
int index = 0;
int vends[MAX] = { 0 };// 用于保存"已有最小生成树"中每个顶点在该最小树中的终点
EData rets[MAX];// 结果数组,保存kruskal最小生成树的边
EData *edges=NULL; // 图对应的所有边
// 获取"图中所有的边"
edges = get_edges(G);
if (edges == NULL)
return;
sorted_edges(edges, G.edgnum);
for (i = 0; i < G.edgnum; i++)
{
p1 = get_position(G, edges[i].start);// 获取第i条边的"起点"的序号
p2 = get_position(G, edges[i].end);// 获取第i条边的"终点"的序号
m = get_end(vends, p1);
n = get_end(vends, p2);
if (m != n)
{
vends[m] = n;
rets[index++] = edges[i];
}
}
length = 0;
for (i = 0; i < index; i++)
length += rets[i].weight;
cout << "Kruskal:" << length << endl;
for (i = 0; i < index; i++)
cout << "(" << rets[i].start << "," << rets[i].end << ")" << endl;
}
int main()
{
Graph G;
CreateJuzhen(G);
Print(G);
kruskal(G);
system("pause");
return 0;
}