邻接矩阵法
邻接矩阵又称数组表示,它采用两个数组表示图:一个数组表示顶点信息(一维数组),另一个数组表示个顶点的关系,这个关系数组叫做邻接矩阵(在邻接矩阵中,若为无向图,矩阵的元素为1或0,1表示有关系,0反之;若为有向网络,则矩阵中的元素表示权,无权值则无无穷)
C语言描述:
#define MAX_VERTEX_NUM 20 //可容纳的最多的顶点个数
#define INFINTY 32768 //表示无穷大
typedef enum{DG,DN,UDG,UDN} GraphKing; //图的种类(分别表示有向图,有向网络,无向图,无向网络)
typedef char VertexData; //图顶点的数据类型,根据实际需要更改
typedef int AdjType; //对于无权图,用1或0表示是否相邻;对于带权图则表示权值
typedef struct{ //struct 定义顶点信息
AdjType adj;
/*可编写其他信息*/
}ArcNode;
typedef struct {
VertexData vertex[MAX_VERTEX_NUM]; //顶点数组
ArcNode arcs[MAX_VERTEX_NUM]
[MAX_VERTEX_NUM]; //邻接矩阵
int vexnum,arcnum; //顶点数目和边的数目
GraphKing kinig; //图的类型
}AdjMatrix; //Adjacency Matrix Graph 邻接矩阵
下面给出测试代码:
#include<stdio.h>
#define MAX_VERTEX_NUM 20 //可容纳的最多的顶点个数
#define INFINITY 32768 //表示无穷大
typedef enum{DG,DN,UDG,UDN} GraphKing; //图的种类(分别表示有向图,有向网络,无向图,无向网络)
typedef int VertexData; //图顶点的数据类型,根据实际需要更改
typedef int AdjType; //对于无权图,用1或0表示是否相邻;对于带权图则表示权值
typedef struct{ //struct 定义顶点信息
AdjType adj;
/*可编写其他信息*/
}ArcNode;
typedef struct {
VertexData vertex[MAX_VERTEX_NUM]; //顶点数组
ArcNode arcs[MAX_VERTEX_NUM]
[MAX_VERTEX_NUM]; //邻接矩阵
int vexnum,arcnum; //顶点数目和边的数目
GraphKing kinig; //图的类型
}AdjMatrix; //Adjacency Matrix Graph 邻接矩阵
//找出该顶点 V 在数组vertex[]中对应位置
int LocateVertex(AdjMatrix *G,VertexData v){
int j,k;
for(k=0;k<G->vexnum;k++){
if(G->vertex[k] == v){
j = k;
break;
}
}
return j;
}
void CreateDN(AdjMatrix *G)
{
int i,j,k,weight;
VertexData v1,v2;
printf("输入顶点个数和边数:\n");
scanf("%d%d",&G->vexnum,&G->arcnum); //顶点和边的数目
printf("输入%d个顶点\n",G->vexnum);
for(i=0;i<G->vexnum;i++)
scanf("%d",&G->vertex[i]);
/*初始化,将矩阵的元素赋值为无穷*/
for(i=0;i<G->vexnum;i++){
for(j=0;j<G->vexnum;j++){
G->arcs[i][j].adj = -1;//-1代表无穷
}
}
printf("输入边的两个顶点,及该边的权值(逗号隔开)\n");
for(k=0;k<G->arcnum;k++){
scanf("%d%d%d",&v1,&v2,&weight);
i = LocateVertex(G,v1);
j = LocateVertex(G,v2);
G->arcs[i][j].adj = weight;
}
}
void PAdjMatrix(AdjMatrix *G)
{
int i,j;
for(i=0;i<G->vexnum;i++)
{
for(j=0;j<G->vexnum;j++){
printf("%d\t",G->arcs[i][j].adj);
}
printf("\n");
}
}
int main()
{
AdjMatrix G;
CreateDN(&G);
PAdjMatrix(&G);
return 0;
}