无向图(使用邻接矩阵)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#define MaxVertices 100 //假设包含100个顶点
#define MaxWeight 32767 //不邻接时为32767,但输出时用 "∞"
typedef struct //包含权的邻接矩阵的的定义
{ int Vertices[MaxVertices]; //顶点信息的数组
int Edge[MaxVertices][MaxVertices]; //边的权信息的数组
int numV; //当前的顶点数
int numE; //当前的边数
}AdjMatrix;
void main()
{ void CreateGraph(AdjMatrix*G);
void DispGraph(AdjMatrix G);
void Prim(AdjMatrix G); //最小生成树的普里姆算法;
AdjMatrix G;
CreateGraph(&G);
DispGraph(G);
Prim(G);
}
void CreateGraph(AdjMatrix*G) //图(带权)的产生函数(建立无(有)向图)
{ int n,e,vi,vj,w,i,j;
printf("请输入图的顶点数和边数(以空格分隔):");
scanf("%d%d",&n,&e);
G->numV=n;G->numE=e;
for(i=0;i
G->Edge[i][j]=0;
else
G->Edge[i][j]=32767;
}
for(i=0;i
{ printf("请输入第%d个顶点的信息(整型):",i+1);
scanf("%d",&G->Vertices[i]);
}
printf("\n");
for(i=0;i
{ printf("请输入边的信息i,j,w(以空格分隔):");
scanf("%d%d%d",&vi,&vj,&w); //建立有向图时只有此句
G->Edge[vi-1][vj-1]=w;
G->Edge[vj-1][vi-1]=w; //建立均向图片时要此句
}
}
void DispGraph(AdjMatrix G) //输出邻接矩阵的信息
{ int i,j;
printf("\n输出顶点的信息(整型):\n");
for(i=0;i
printf("\n输出邻接矩阵:\n");
printf(" ");
for(i=0;i
for(i=0;i
for(j=0;j
printf("%8s", "∞");
else
printf("%8d",G.Edge[i][j]);
}
printf("\n");
}
}
typedef struct //定义最小生成树的带权边
{ int begin,end; //边的起点和终点
int weight; //边的权值
}MinSpanTree;
void Prim(AdjMatrix G) //最小生成树的普里姆算法
{ int n,j,k,v,min,m;
n=G.numV;
MinSpanTree e,mintree[100]; //mintree生成树数组
for(j=1;j
mintree[j-1].end=j+1;
mintree[j-1].weig
ht=G.Edge[0][j];
}
for(k=0;k
for(j=k;j
e=mintree[m];mintree[m]=mintree[k];mintree[k]=e;
v=mintree[k].end;
for(j=k+1;j
if(d
mintree[j].begin=v;
}
}
}
printf("最小生成树为:");
for(j=0;j
printf("\n");
}