#include <stdio.h>
#define INFINITY 65535
#define MAXVEX 10
typedef struct
{
char vertexs[MAXVEX];
int arc[MAXVEX][MAXVEX];
int vexnum,arcnum;
}GraphType;
void Create(GraphType*);//创建
int Located(GraphType*,char);
void MiniSpanTree_prime(GraphType*,int*P,int*D,char v);
int main(void)
{
GraphType G;
int P[MAXVEX],D[MAXVEX];
char v;
Create(&G);
printf("亲输入你要生成树的的根节点:");
scanf("\n%c",&v);
MiniSpanTree_prime(&G,P,D,v);
return 0;
}
int Located(GraphType*G,char v)
{
int i,k=-1;
for(i=0;i<G->vexnum;i++)
{
if(v==G->vertexs[i])
{
k=i;
break;
}
}
return k;
}
void Create(GraphType*G)
{
int i,j,v,w,weight;
char m,n;
printf("请输入你要顶点个数和边数");
scanf("%d %d",&G->vexnum,&G->arcnum);
printf("亲输入顶点信息:");
for(i=0;i<G->vexnum;i++)
scanf("\n%c",&(G->vertexs[i]));
for(i=0;i<G->vexnum;i++)//初始化
for(j=0;j<G->vexnum;j++)
{
if(i==j)
G->arc[i][j]=0;
else
G->arc[i][j]=INFINITY;
}
printf("亲输入相关联的顶点及其他们的直接的权值:");
for(i=0;i<G->arcnum;i++)
{
scanf("\n%c,%c,%d",&m,&n,&weight);
v=Located(G,m);
w=Located(G,n);
G->arc[v][w]=weight;
G->arc[w][v]=weight;
}
for(i=0;i<G->vexnum;i++)
{
for(j=0;j<G->vexnum;j++)
printf("%6d ",G->arc[i][j]);
printf("\n");
}
return ;
}
void MiniSpanTree_prime(GraphType*G,int*P,int*D,char v0)
{
int i,j,k,m,n,min,e,adjvex[MAXVEX],lowcost[MAXVEX];//adjvex[MAXVEX]//用来存放相关定点的下标,lowcost[MAXVEX];用来存放相关定点之的权值
char x,y;
k=Located(G,v0);//首先要去确定v0的位置
lowcost[k]=0;//初始化U={u};
for(i=0;i<G->vexnum;i++)
{
if(i!=k)
{
adjvex[i]=v0;
lowcost[i]=G->arc[k][i];
}
}
for(e=1;e<G->vexnum;e++)//除了v0外,还有找n-1条边
{
min=INFINITY;
k=0;//复位
for(j=0;j<G->vexnum;j++)//在V-U中找到离v0权值最小的定点
if(lowcost[j]!=0&&lowcost[j]<min)
{
min=lowcost[j];
k=j;//k用来保存这个距离最近定点
}
x=adjvex[k];
y=G->vertexs[k];
m=Located(G,x);
n=Located(G,y);
printf("%c->%c->weight:%d\n",x,y,G->arc[m][n]);
lowcost[k]=0;//将找到的这个定点并入U集合离
for(i=0;i<G->vexnum;i++)
{
if(G->arc[k][i]<lowcost[i])//如果新定点的的邻接边小于上一点定点相对应的邻接边。就更新
{
lowcost[i]=G->arc[k][i];
adjvex[i]=y;
}
}
}
return ;
}
#define INFINITY 65535
#define MAXVEX 10
typedef struct
{
char vertexs[MAXVEX];
int arc[MAXVEX][MAXVEX];
int vexnum,arcnum;
}GraphType;
void Create(GraphType*);//创建
int Located(GraphType*,char);
void MiniSpanTree_prime(GraphType*,int*P,int*D,char v);
int main(void)
{
GraphType G;
int P[MAXVEX],D[MAXVEX];
char v;
Create(&G);
printf("亲输入你要生成树的的根节点:");
scanf("\n%c",&v);
MiniSpanTree_prime(&G,P,D,v);
return 0;
}
int Located(GraphType*G,char v)
{
int i,k=-1;
for(i=0;i<G->vexnum;i++)
{
if(v==G->vertexs[i])
{
k=i;
break;
}
}
return k;
}
void Create(GraphType*G)
{
int i,j,v,w,weight;
char m,n;
printf("请输入你要顶点个数和边数");
scanf("%d %d",&G->vexnum,&G->arcnum);
printf("亲输入顶点信息:");
for(i=0;i<G->vexnum;i++)
scanf("\n%c",&(G->vertexs[i]));
for(i=0;i<G->vexnum;i++)//初始化
for(j=0;j<G->vexnum;j++)
{
if(i==j)
G->arc[i][j]=0;
else
G->arc[i][j]=INFINITY;
}
printf("亲输入相关联的顶点及其他们的直接的权值:");
for(i=0;i<G->arcnum;i++)
{
scanf("\n%c,%c,%d",&m,&n,&weight);
v=Located(G,m);
w=Located(G,n);
G->arc[v][w]=weight;
G->arc[w][v]=weight;
}
for(i=0;i<G->vexnum;i++)
{
for(j=0;j<G->vexnum;j++)
printf("%6d ",G->arc[i][j]);
printf("\n");
}
return ;
}
void MiniSpanTree_prime(GraphType*G,int*P,int*D,char v0)
{
int i,j,k,m,n,min,e,adjvex[MAXVEX],lowcost[MAXVEX];//adjvex[MAXVEX]//用来存放相关定点的下标,lowcost[MAXVEX];用来存放相关定点之的权值
char x,y;
k=Located(G,v0);//首先要去确定v0的位置
lowcost[k]=0;//初始化U={u};
for(i=0;i<G->vexnum;i++)
{
if(i!=k)
{
adjvex[i]=v0;
lowcost[i]=G->arc[k][i];
}
}
for(e=1;e<G->vexnum;e++)//除了v0外,还有找n-1条边
{
min=INFINITY;
k=0;//复位
for(j=0;j<G->vexnum;j++)//在V-U中找到离v0权值最小的定点
if(lowcost[j]!=0&&lowcost[j]<min)
{
min=lowcost[j];
k=j;//k用来保存这个距离最近定点
}
x=adjvex[k];
y=G->vertexs[k];
m=Located(G,x);
n=Located(G,y);
printf("%c->%c->weight:%d\n",x,y,G->arc[m][n]);
lowcost[k]=0;//将找到的这个定点并入U集合离
for(i=0;i<G->vexnum;i++)
{
if(G->arc[k][i]<lowcost[i])//如果新定点的的邻接边小于上一点定点相对应的邻接边。就更新
{
lowcost[i]=G->arc[k][i];
adjvex[i]=y;
}
}
}
return ;
}