图的存储结构——邻接矩阵和邻接表

接下来的内容都是默写的,,正确性有待检查,,,,QAQ

图的基本概念:

:顶点集V和弧集R构成的数据结构 G=(V,R);

有向图: 顶点集V和弧集R构成的图 

无向图:顶点集V和边集R构成的图

有/无向网:具有权值的有/无向图

完全图:n个顶点 n(n-1)/2条边的无向图

有向完全图:n个顶点 n(n-1)条边的有向图

子图:有图 G={V,{VR}} ,G`={V`,{VR`}};V`包含与V VR包含于VR`

稀疏图:n个顶点,e条边,当e<nlogn 

稠密图:e>=nlogn;

邻接点:无向图中v,w顶点之间存在一条弧,则v,w互为邻接点

顶点的度:顶点关联的边或弧的数成为度

               无向图中:图的总度数=总边数的两倍

               有向图   :图的入度=图的出度=总弧数

                                图的度=图的入度+出度

路径:由一个顶点到另一个顶点做过所有顶点的序列的集合

简单路径:顶点不重复的路径成为简单路径

回路:首尾顶点相同的路径

简单回路:只有首尾顶点重复的路径

连通图:特指在无向图中,任意两个顶点之间有联系,

强连通图:特指在有向图中,任意两个顶点之间都存在一条有向路径

生成树:在连通图上的极小连通子图

在第一张图求它的生成树

图的存储结构:

分为4种:

  1.邻接矩阵

   2.邻接表

  3.十字链表

  4.多重链表

在这里,博主能力有限指写了前两种,,,,啦啦啦阿联QAQ

 1.邻接矩阵:

#include<stdio.h>
#define MAXSIZE 20
//无向图结构体的定义 
typedef struct
{
	int  arcs[MAXSIZE][MAXSIZE];//边的信息 
	char ch[MAXSIZE];   //顶点信息 
	int vexnum;//顶点数 
	int arcnum;//边数	
}AdjMatrix;
// 无向图的创建   0行0列不存单元 
void Create_Adj(AdjMatrix *G)
{
	int i,j,vex1,vex2;
	printf("请输入顶点和边的信息:\n");
	scanf("%d %d",&G->vexnum,&G->arcnum);
	//printf("%d %d",G->vexnum,G->arcnum);
	//初始化  0:无联系 1:有联系
	for(i=1;i<=G->vexnum;i++)
	   for(j=1;j<=G->vexnum;j++)
	    G->arcs[i][j]=0;
	    
	printf("请输入顶点信息\n");
	
	for(j=1;j<=G->vexnum;j++)
	{
	 
	 printf("请输入第%d个顶点\n",j);//我这里放了一个\n需要getchar()吸收掉 
	 getchar();
     scanf("%c",&G->ch[i]);
	}
	
	for(i=1;i<=G->arcnum;i++)
	{
		printf("请输入第%d条边\n",i);
		scanf("%d",&vex1);
		printf("---");
		scanf("%d",&vex2);
	//	getchar();
		printf("\n");
		G->arcs[vex1][vex2]=1;//vex1到vex2有联系 
		G->arcs[vex2][vex1]=1;
	}
}
void print_AdjMatrix(AdjMatrix *G)
{
	int i,j;
	for(i=1;i<=G->vexnum;i++)
	printf("%c ",G->ch[i]);
	printf("\n");
	for(i=1;i<=G->vexnum;i++){
		printf("%c",G->ch[i]);
		for(j=1;j<=G->vexnum;j++)
	 	{
	 		printf("%d ",G->arcs[i][j]); 
	 	 }
	 	printf("\n"); 
	}
} 
int main()
{
 AdjMatrix G;
 Create_Adj(&G);
print_AdjMatrix(&G);
return 0;
} 

运行结果:

优缺点:

可以从两个方面来探讨

1.存储空间:又上图可知邻接矩阵时对称矩阵,因此是有空间浪费的。我们可以举一个例子:

  假设邻接矩阵的空间为n ,那么采用压缩矩阵存储的,只用下三角就能完成;当表示无向图的时候,只需要n(n-2)/2

若为有向图的话,存储空间为n^2

2.运算 :1>/采用邻接矩阵可直接判断2个顶点之间的关系

               2>/也可判断各个顶点的度数     

    无向图:TD(i)=A[I][J](j=1......N) 第I个顶点的度就等于矩阵中第I行非零元素的个数

   有向图  :OD(i)=A[I][J](J=1...N)第I 个顶点的度就等于矩阵中第I行非零元素的个数

                    ID(i)=A[I][J](IJ=1,2,.....,N)第I个顶点的度就等于矩阵中第I类非零元素的个数;

EEE就到这里吧,,写不完了。。。。

   

猜你喜欢

转载自blog.csdn.net/weixin_42143003/article/details/86669283