1. 图的基本概念
图是一种非线性数据结构,由顶点(Vertex)的集合和连接这些顶点的边(Edge)的集合组成。formally表示为G = (V, E),其中V是顶点集合,E是边集合。
图可以用来表示很多现实世界中的关系,比如社交网络、地图路线、网络拓扑等。
1.1 基本术语
- 顶点(Vertex):图中的基本单元,也称为节点。
- 边(Edge):连接两个顶点的线段。
- 度(Degree):与某个顶点相连的边的数量。
- 路径(Path):从一个顶点到另一个顶点的顶点序列。
- 环(Cycle):起点和终点相同的路径。
2. 图的类型
2.1 有向图与无向图
- 无向图:边没有方向,$(v,w)$和$(w,v)$表示同一条边。
- 有向图:边有方向,$(v,w)$和$(w,v)$是不同的边。
2.2 加权图与非加权图
- 非加权图:边没有与之关联的权值。
- 加权图:每条边都有一个权值,表示某种成本或距离。
2.3 其他类型
- 完全图:每个顶点都与其他所有顶点相连。
- 连通图:任意两个顶点之间都存在路径。
- 二分图:顶点可以分为两个不相交的集合,每条边连接的两个顶点分别属于这两个集合。
3. 图的表示方法
3.1 邻接矩阵
使用一个二维数组来表示图,如果顶点i和j之间有边,则matrix[i][j] = 1(或权值),否则为0。
#define MAX_VERTICES 100
int adjMatrix[MAX_VERTICES][MAX_VERTICES];
// 初始化图
void initGraph(int vertices) {
for (int i = 0; i < vertices; i++)
for (int j = 0; j < vertices; j++)
adjMatrix[i][j] = 0;
}
// 添加边
void addEdge(int start, int end) {
adjMatrix[start][end] = 1;
adjMatrix[end][start] = 1; // 对于无向图
}
// 打印图
void printGraph(int vertices) {
for (int