#include
#include
#include
#define INFINITY 1000
#define max_name 50
#define max_vertex_num 50
typedef char vertex[max_name];//顶点名字串
typedef int adjMatrix[max_vertex_num][max_vertex_num];//邻接距阵
typedef struct
{vertex adjvex; //邻接矩阵
int lowcost;//权值
}close[max_vertex_num];//定义一个结构以便在后面closedge使用
typedef struct//定义图
{
vertex vexs[max_vertex_num]; //顶点集
adjMatrix arcs; //边
int vexnum,arcnum;//点个数,边个数
}MGraph;
int LocateVex(MGraph G,vertex u)//若G中存在顶点u,则返回该点在图中位置;否则返回其他信息;
{
int i;
for(i=0;i
if(strcmp(u,G.vexs[i])==0)
return i;
return 1;
}
void CreateGraph(MGraph &G)
{
int i,j,k,w;
vertex v1,v2;
printf("输入无向图顶点数和边数:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
printf("输入各顶点的值:\n", G.vexnum);
for(i=0;i
scanf("%s",&G.vexs[i]);
for(i=0;i
for(j=0;j
G.arcs[i][j]=INFINITY;
printf("输入一条边依附的顶点及权值:\n",G.arcnum);//输入一条边依附的顶点及权值
for(k=0;k
{
scanf("%s%s%d",v1,v2,&w);
i=LocateVex(G,v1);//v1在图中位置
j=LocateVex(G,v2);//v2在图中位置
G.arcs[i][j]=G.arcs[j][i]=w; //置于对称弧
}
}
int minimum(close c,MGraph G)//求出下一个节点 第k个顶点
{
int i=0,j,k,min;
min=INFINITY;
//初始化
k=-1;
for(j=0;j<=G.vexnum;j++)//求最小
if(c[j].lowcost0)
{
min=c[j].lowcost;
k=j;
}
return k;
}
void PRIM(MGraph G,vertex u)
{
int i,j,k=0;
close closedge;//一个结构
bool isbreak=false;
k=LocateVex(G,u);//u在图中位置 返回G.vexs[i]中下标
for(j=0;j<=G.vexnum;++j) //辅助数组初始化closedge从O开始
{
if(j!=k)//没有自己到自己的
closedge[k].lowcost=0;
strcpy(closedge[j].adjvex,u);
closedge[j].lowcost=G.arcs[k][j];//列
}
int flag[1000];
flag[0]=0;
int count=1;
for(i=1;i
{
k=minimum(closedge,G);
if(k==-1)
{
isbreak=true;
break;
}
printf("%s-%s%d\n",closedge[k].adjvex,G.vexs[k],G.arcs[k][LocateVex(G,closedge[k].adjvex)]); //输出生成树的边
closedge[k].lowcost=0; //第k个顶点并入U集
flag[count]=k;
count++;
for(j=0;j
if(G.arcs[k][j]
{
strcpy(closedge[j].adjvex,G.vexs[k]);
closedge[j].lowcost=G.arcs[k][j];
}
}
if(isbreak)
{
printf("此图不连通,无最小支撑树 !\n访问过的点为:\n");
for(i=0;i
{
printf("%s",G.vexs[flag[i]]);
}
printf("\n");
}
}
void main()
{
MGraph G;
CreateGraph(G);
printf("最小生成树的各条边为: \n");
PRIM(G,G.vexs[0]);
}
此处給出1个赋权图,用prim算法找出赋权图上的最小树.
1111s1s3325465652441731图1.71
图1结果如下:
注释:图1中有7个点10条边,最后结果输出最小生成树为:
1111s1s3325466524131图1.71
图1最小权值W=5+1+2+3+4+1= 16