图的概念
图是由节点(也称为顶点)和边(也称为边缘)组成的非线性数据结构。节点是图的基本单元,边则用于连接节点之间的关系。图可以用于许多不同的应用程序,包括社交网络、网络拓扑、地图和生物学。
在图中,节点和边可以具有不同的属性。例如,一个社交网络图可能具有节点属性表示用户的姓名和年龄,边属性可能表示用户之间的关系,如朋友或家庭关系。图可以是有向或无向的,也可以是加权或未加权的。有向图具有指向边的方向,而无向图则没有。加权图则对边进行加权,这些权重可以表示距离、成本或其他数据。
图的定义:图G由顶点集V和边集E组成,G = (V,E);
有向图与无向图
如果给图的每条边规定一个方向,那么该图称为有向图。在有向图中,从一个顶点出发的边数称为该点的出度,而指向一个顶点的边数称为该点的入度。相反,边没有方向的图称为无向图。
在有向图中,边指向的结点是唯一的,而无向图的边所连接的结点相互连通;
有权图与无权图
如果图中的边都有各自的权重,则称该图为有权图。反之,如果图中的边无权重(各边的权重相同),则该图为无权图;
图的存储
常用的存储方式有两种:邻接矩阵和邻接表。得分
邻接矩阵:
图的邻接矩阵是一个二维矩阵,矩阵的行和列分别对应图中的顶点。如果两个顶点之间有边,则矩阵中对应的元素为1;否则为0。对于无向图来说,邻接矩阵是对称的。而对于有向图来说,邻接矩阵则不一定对称。因此邻接矩阵的表示相当的直观,而且对于查找某一条边是否存在、权重多少非常快。但其比较浪费空间,对稠密图来说,会比较适合。
代码实现步骤:
1、构建图的基本元素与图的初始化
#define Maxcount 100
struct Node{ //图
int Nv; //顶点数
int Ne; //边数
int data[Maxcount]; //顶点数据
int wight[Maxcount][Maxcount]; //边的权重
};
struct Nodes //边
{
int V1, V2; //边所连接的顶点
int wight; //边的权重
};
void initialize(struct Node *graph ,int Vexcount) //初始化图
{
graph->Nv = Vexcount; //顶点数
graph->Ne = 0; //边数置零
for (int i = 0; i <= Vexcount; i++)
{
for (int j = 0; j <= Vexcount; j++)
{
graph->wight[i][j] = 0; //初始化每条边的比重
}
}
}
2、插入边的权重
void insertedge(struct Node* graph, struct Nodes* edge) //插入边的权重(无向图)
{
graph->wight[edge->V1][edge->V2] = edge->wight;
graph->wight[edge->V2][edge->V1] = edge->wight;
}
3、主函数
int main()
{
printf("邻接矩阵实现图!\n");
int count;
printf("图的顶点数:");
scanf_s("%d/n", &count);
struct Node* graph = (struct Node*)malloc(sizeof(struct Node));
initialize(graph, count);
int edgecoun