接下来的内容都是默写的,,正确性有待检查,,,,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就到这里吧,,写不完了。。。。