图
有向图、无向图、加权有向图
度,连接一个节点的边数。有向图有入度和出度。
关于图的连通性,无向图任何两个点都可以到达称为连通图。如果图看起来有两个部分,即有两个节点到不了,为非连通图。
强连通图是有向图的概念,有向图中任意两个节点可以到达。
图的构造。即如何用代码来实现一个图。
邻接表、邻接矩阵
邻接矩阵用二维数组来表示图结构,有多少节点就申请多大的二维数组。如 grid[2][5] = 3 表示节点 2 和节点 5 连接,权值为 6。
这种表达方式(邻接矩阵) 在 边少,节点多的情况下,会导致申请过大的二维数组,造成空间浪费。
而且在寻找节点连接情况的时候,需要遍历整个矩阵,即 n * n 的时间复杂度,同样造成时间浪费。
邻接矩阵的优点
表达方式简单,易于理解
检查任意两个顶点间是否存在边的操作非常快
适合稠密图,在边数接近顶点数平方的图中,邻接矩阵是一种空间效率较高的表示方法。
邻接表使用数组+链表来表示。
图的遍历,dfs,bfs。
有向图的遍历
图连接关系的表示
#include <stdio.h>
int *result; int result_len; / 结果的数量 */
int single_out; int single_len; / 单个结果,路径长度 */
int result_col_len; / 存放每个路径长度的数组 */
int node_total_num;
int *node_connect_nums;
void dfs(int **graph, int start_node) { // 当前节点已经是最后一个节点了 if (start_node == node_total_num) { //保存
}
int** allPathsSourceTarget(int** graph, int graphSize, int* graphColSize, int* returnSize, int** returnColumnSizes) {
}
int main() { int node_nums, route_nums; scanf("%d %d", &node_nums, &route_nums);
}
最后更新于