graph.h
#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
#define MAXVEX 100 /**< 最多顶点数 */
#define INFINITY 65535/**< 不存在该边是的权值 */
struct graph;
typedef struct graph *Graph;
typedef int VertexType;
typedef int EdgeType;
struct graph
{
VertexType vertex[MAXVEX];
EdgeType edge[MAXVEX][MAXVEX];
int numvertex,numedge;
};
void CreatGraph(Graph G);/**< 创建图 */
void PrintGraph(Graph G);/**< 将图以邻接矩阵的形式打印出来*/
void Prime(Graph G);/**< 最小生成树算法 */
#endif // GRAPH_H_INCLUDED
graph.c
#include <stdio.h>
#include "graph.h"
/**
*作者:孤月天心 2013年10月
* any question related to me.
*/
void CreatGraph(Graph G)
{
int i,j,k,w;
printf("input the number of vertex ang edge:\n");
printf("the number of vertex :");
scanf("%d",&G->numvertex);
printf("\n");
printf("the number of edge:");
scanf("%d",&G->numedge);
/**< 输入顶点 */
for(i=0;i<G->numvertex;i++)
{
scanf("%d",&G->vertex[i]);
}
/**< 矩阵初始化 */
for(i=0;i<G->numvertex;i++)
{
for(j=0;j<G->numedge;j++)
{
G->edge[i][j] = INFINITY;
}
}
/**< 输入边的权值此处一边控制循环次数 */
for(k=0;k<G->numedge;k++)
{
printf("input vertex and weight:\n");
scanf("%d %d %d",&i,&j,&w);
G->edge[i][j] = w;
G->edge[j][i] =G->edge[i][j];
}
}
void PrintGraph(Graph G)
{
int i,j;
for(i=0;i<G->numvertex;i++)
{
for(j=0;j<G->numvertex;j++)
{
if(G->edge[i][j] == INFINITY)
printf("\t**");
else
printf("\t%d",G->edge[i][j]);
}
printf("\n");
}
}
void Prime(Graph G)
{
int min,i,j,k;
int adjvertex[MAXVEX];/**< 邻接点数组 */
int lowcost[MAXVEX];/**< 值为零表示该点已加入最小生成树 */
lowcost[0] = 0;
adjvertex[0] = 0;
/**< 初始化辅助数组初始化为第一行数据 */
for(i=1;i<G->numvertex;i++)
{
lowcost[i] = G->edge[0][i];
adjvertex[i] = 0;
}
/**< 主循环,不断更换两个数组的值直到lowcost全为零 */
for(i=1;i<G->numvertex;i++)
{
min = INFINITY;
j=1;
k=0;
/**< 循环全部顶点 */
while(j<G->numvertex)
{
if(lowcost[j] != 0 && lowcost[j] < min)
{
min=lowcost[j]; /**< 求出当前最小权值存入K中 */
k=j;
}
j++;
}
printf("(%d,%d)",adjvertex[k],k); /**< 打印边 */
lowcost[k] = 0; /**< 表示k已加入生成树 */
/**< 更新adjvertex数组数据,查找所有与K相邻点的最小权值(即邻接矩阵第k行数据) */
for(j=1;j<G->numvertex;j++)
{
if(lowcost[j] != 0 && G->edge[k][j] < lowcost[j])
{
lowcost[j] = G->edge[k][j]; /**< 将较小权值存入lowcost */
adjvertex[j] =k; /**< 将k存入邻接数组以备下次循环比较用 */
}
}
}
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include "graph.c"
int main()
{
Graph G;
G=(Graph)malloc(sizeof(struct graph));
CreatGraph(G);
PrintGraph(G);
Prime(G);
return 0;
}