1 图的介绍
1.1 定义
G = (V, E)
- 一组节点V
- 一组边E
- 节点的度:相邻节点的数量
- 完备图:所有节点都有n-1个相邻节点,即任意2节点间可达
1.2 分类
根据边分类
无向图
n1 ---- n2 | | | | n3 ---- n4有向图
--> n2 n1 --> n4 --> n3带权有向图
3 ---> n2 6 n1 ---> n4 ---> n3 5
图的性质分类
- 同构图:G和H,通过重新标记G的节点产生H。阶相等,顶点度数相等
- 异构图
1.3 表示
邻接矩阵
如果节点间ni,nj之间有弧,则[ni, nj] = 1n1 n2 n3 n4 +------------+ n1 | 0 1 1 0 | n2 | 0 0 0 1 | n3 | 0 0 0 1 | n4 | 0 0 0 0 | +------------+无向图的斜下半部分是多余的
#define MAX_NODE_NUM typedef struct { int node_cnt; int edge_matrix[MAX_NODE_NUM][MAX_NODE_NUM]; int node_visit[MAX_NODE_NUM][MAX_NODE_NUM]; } Graph;邻接表
[1] -> [2, 3] [2] -> [4] [3] -> [4] [4] -> []typedef struct Node { int val; int weight; struct Node *next; } Node; typedef struct { int val; Node *next; } GraphNode; GraphNode graph[] = {0};弧表示法
-----+---------------+ 起点 | 1 | 1 | 2 | 3 | 终点 | 2 | 3 | 4 | 4 | 权重 | | | | | -----+---------------+
2 图的遍历
#define MAX_NODE_NUM
typedef struct {
int node_num;
int edge_matrix[MAX_NODE_NUM][MAX_NODE_NUM];
int node_visit[MAX_NODE_NUM][MAX_NODE_NUM];
} Graph;
typedef struct {
int x;
int y;
} NodePlace;
void graph_dfs(Graph *graph, NodePlace node)
{
int i;
int j;
for (i = 0; i < graph->node_cnt; i++) {
.
}
}