图的邻接矩阵(Adjacency?Matrix)存储方式是用两个数组来表示图。一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
图矩阵的创建:
首先思考图的结构利用矩阵
1.输入顶点数总边数
2.依次输入点的信息
3.初始化邻接矩阵使得每个权值都初始化为无穷大
4. 构造邻接矩阵。依次输入每条边依附的顶点和其权值。利用无向矩阵对称。即对称边赋相同的值
void CreateAMGraph(AMGraph &G){
printf("请输入顶点以及边的个数:(中间用逗号隔开)\n");
scanf("%d,%d",&G.vexnum,&G.arcnum);//输入顶点数目边的数目
getchar();
printf("请输入顶点:\n");
for(int i=0;i<G.vexnum;i++){
scanf("%c",&G.Vexs[i]);//输入每个顶点
getchar();
}
for(int i=0;i<G.vexnum;i++){
for(int j=0;j<G.vexnum;j++){
G.arcs[i][j]=Max ;//将每条边初始为无穷大
}}
for(int k=0;k<G.arcnum;k++){
int v1,v2,w;//定义了起点,终点,对应边的权值
printf("输入两个顶点,该边的权值(对应的下标)(用逗号隔开)\n");
scanf("%d,%d,%d",&v1,&v2,&w);
getchar();
G.arcs[v1][v2]=w;//输入起点终点以及两点连起来的边的权值
G.arcs[v2][v1]=G.arcs[v1][v2];//因为无向图具有对称性
}
}
图的遍历输出
void TrverseAMGraph(AMGraph &G){//矩阵遍历
for(int i=0;i<G.vexnum;i++){
for(int j=0;j<G.vexnum;j++){
if(G.arcs[i][j]!=Max){
printf("%d\t",G.arcs[i][j]);
}
else printf("0\t");
}
printf("\n");
}
}
整体代码:
#include <stdio.h>
#include <stdlib.h>
#define Mvnum 100
#define Max 32722
typedef int ArcType;//将边的权值类型定义为整形
typedef char VertexType;//将顶点的类型定义为字符型
typedef struct {
VertexType Vexs[Mvnum];//将定点存入数组
ArcType arcs[Mvnum][Mvnum];//边的权值
int vexnum,arcnum;//当前顶点个数,边的个数
}AMGraph;
void CreateAMGraph(AMGraph &G){
printf("请输入顶点以及边的个数:(中间用逗号隔开)\n");
scanf("%d,%d",&G.vexnum,&G.arcnum);//输入顶点数目边的数目
getchar();
printf("请输入顶点:\n");
for(int i=0;i<G.vexnum;i++){
scanf("%c",&G.Vexs[i]);//输入每个顶点
getchar();
}
for(int i=0;i<G.vexnum;i++){
for(int j=0;j<G.vexnum;j++){
G.arcs[i][j]=Max ;//将每条边初始为无穷大
}}
for(int k=0;k<G.arcnum;k++){
int v1,v2,w;//定义了起点,终点,对应边的权值
printf("输入两个顶点,该边的权值(对应的下标)\n");
scanf("%d,%d,%d",&v1,&v2,&w);
getchar();
G.arcs[v1][v2]=w;//输入起点终点以及两点连起来的边的权值
G.arcs[v2][v1]=G.arcs[v1][v2];//因为无向图具有对称性
}
}
void TrverseAMGraph(AMGraph &G){//矩阵遍历
for(int i=0;i<G.vexnum;i++){
for(int j=0;j<G.vexnum;j++){
if(G.arcs[i][j]!=Max){
printf("%d\t",G.arcs[i][j]);
}
else printf("0\t");
}
printf("\n");
}
}
int main(){
AMGraph G;
CreateAMGraph(G);
TrverseAMGraph(G);
return 0;
}
|