图的最小生成二叉树

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
typedef struct vexs
//顶点的值
{
char data[3];
}vextype;
typedef struct adjs
//顶点之间的关系
{
int adj;
//邻接矩阵0代表两顶点不是邻接,其他是邻接
}adjtype;
typedef struct MGraph
//图结构
{
vextype *vexs;
adjtype **adjs;
int vex_num;
//顶点个数
int adj_num;
//边数
}MGraph;
struct close
//用来存放已经遍历过的顶点数据
{
vextype vex;
int lowcost;
}*close;
void init_mgraph(MGraph *G)
//初始化图
{
int m,n;
int i=0;
printf("请输入顶点个数和边数,以空格间隔:\n");
scanf("%d %d",&m,&n);
G->vexs=(vextype*)malloc(m*sizeof(vextype));
//分配顶点空间
G->adjs=(adjtype**)malloc(m*sizeof(adjtype*));
for(;i<m;i++)
//分配邻接矩阵空间
{
G->adjs[i]=(adjtype*)malloc(m*sizeof(adjtype));
}
G->vex_num=m;
//图的顶点个数
G->adj_num=n;
//图的边数
}
void insert_vex(MGraph *G,vextype e,int i)
//给顶点赋值
{
strcpy(G->vexs[i].data,e.data);
}
int location(MGraph *G,vextype e)
//寻找顶点在邻接矩阵的位置
{
int i=0;
for(;i<G->vex_num;i++)
{
if(strcmp(G->vexs[i].data,e.data)==0)
{
return i;
}
}
return -1;
}
void create_UND(MGraph *G)
//构建图结构
{
vextype head;
//边的头顶点
vextype trail;
//边的尾顶点
int adj_weight;
//边的权重
int i;
int j;
int m;
int n;
for(i=0;i<G->vex_num;i++)
// 初始化邻接矩阵
{
for(j=0;j<G->vex_num;j++)
{
G->adjs[i][j].adj=0;
}
}
printf("依次输入边的头顶点、尾顶点、权值,以空格间隔:\n");
for(i=0;i<G->vex_num*G->vex_num;i++)
{
scanf("%s %s %d",head.data,trail.data,&adj_weight);
m=location(G,head);
n=location(G,trail);
if(m!=-1&&n!=-1)
//确定顶点在邻接矩阵的位置成功
{
G->adjs[m][n].adj=adj_weight;
// G->adjs[n][m].adj=adj_weight;
//只当是有向图才有用,无向图可以省去
}
else
{
printf("输入的顶点有误\n");
exit(0);
}
fflush(stdin);
}
}
void prin_adj(MGraph *G)
//输出邻接矩阵
{
int i;
int j;
printf("输出的邻接矩阵:\n");
for(i=0;i<G->vex_num;i++)
{
for(j=0;j<G->vex_num;j++)
{
if(G->adjs[i][j].adj!=0)
{
printf("%d ",G->adjs[j][i].adj);
}
else
{
printf("∞ ");
}
}
printf("\n");
}
}
int minimum(MGraph *G,struct close *close)
{
int i=0;
int mini=0;
for(;i<G->vex_num;i++)
{
if(close[i].lowcost!=0)
{
mini=i;
break;
}
}
for(;i<G->vex_num;i++)
{
if(close[i].lowcost==0)
{
continue;
}
else
{
mini=close[i].lowcost<close[mini].lowcost?i:mini;
}
}
return mini;
}
void mini_tree(MGraph *G,vextype e)
{
int k;
int i;
int j;
close=(struct close*)malloc(G->vex_num*sizeof(struct close));
//为数组分配空间
k=location(G,e);
for(i=0;i<G->vex_num;i++)
//初始化close数组
{
if(i!=k)
{
strcpy(close[i].vex.data,e.data);
}
close[i].lowcost=G->adjs[k][i].adj;
}
close[k].lowcost=0;
//已经访问过的顶点做标志
for(i=0;i<G->vex_num-1;i++)
{
k=minimum(G,close);
printf("生成的树的边:\n");
printf("%s - %s \n",close[k].vex.data,G->vexs[k].data);
//输出生成树的边
close[k].lowcost=0;
for(j=0;j<G->vex_num;j++)
//找出后面其他除0外比K小的
{
if(G->adjs[k][j].adj<close[j].lowcost)
{
strcpy(close[j].vex.data,G->vexs[k].data);
close[j].lowcost=G->adjs[k][j].adj;
}
}
}
}
int main()
{
MGraph G;
vextype e;
int i=0;
init_mgraph(&G);
//初始化图
for(;i<G.vex_num;i++)
{
printf("请输入顶点值:\n");
scanf("%s",e.data);
insert_vex(&G,e,i);
fflush(stdin);
//给顶点赋值
}
create_UND(&G);
//构造图结构
printf("邻接矩阵:\n");
prin_adj(&G);
//输出邻接矩阵
printf("请输入树根:\n");
scanf("%s",e.data);
printf("生成树的所有边:\n");
mini_tree(&G,e);
//从顶点e开始生成最小树
return 0;
}$

posted @ 2011-09-30 00:15  jim_wu  阅读(448)  评论(0编辑  收藏  举报