一:图论的概念
图是表示物件与物件之间的关系的数学对象,是图论的基本研究对象。
图和以前所学的变量数组栈这类的东西最大的不同就是直观,通过一个图就可以说明几十行表达式所要表示的关系。
最基本的图由点和线构成,一个个离散的点代表着研究的对象,它们被称之为结点,而把它们串联起来的这些线我们称之为边。
图能够表达晦涩难懂的文字,用图解题会更为好懂。
图还分为有向图无向图之类的,下文看题会有涉及。
二:图论能干的事
图论最大的作用就是搜索,包括BFS和DFS,这叫做图遍历。
广搜和深搜是用于在图中搜索节点的两种不同算法。它们通常用于确定我们是否可以从给定节点到达某个节点。
BFS的目的是尽可能接近根节点遍历图,而DFS算法旨在尽可能远离根节点。
最基本的题型精简一下就是下边这样
从A到B的最短途径是什么?分别从距离和时间角度考虑。
有没有办法从C到D?
典型的搜索本子题叭
(以下干货时间)
三:图论中常用的知识点(性质)
①连通性
任何两个顶点之间都可以通过一条路连接,这样的图称为连通的。相反称为不连通的。
这就像只考虑铁路运输的时候,亚欧大陆显然是一个连通图(内陆岛屿不算!),而由于海洋的存在,它跟美洲大陆就挨不到一起,他俩放在一起就不是一个连通的图。
②树
树比图论学的早真是令人匪夷所思,树作为图的一种,在代码领域运用极其广泛。
一棵树主要由爸爸和儿子构成...
哦不说错了,是子节点和父节点
每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树
这货真画出来根本不像棵树...你要把它倒过来看才能发现被称作树的真谛
树里面最为常用的一棵(一种)就是二叉树,主要是因为所有的树经过改造都能变成它...它也因为所解决的问题不同被赋予了不同的名称
空二叉树//只有一个根结点的二叉树//只有左子树//只有右子树//完全二叉树
对于完全二叉树的问题则极为重要,因为它代表着完成一个计划的所有情况,搜索和DP往往就在完全二叉树中进行
深度则指的是二叉树的高度,也就是所谓的家里几代人
而普通树转二叉树,一般采用左“子女”右“兄弟”的方式来转化,一步一步对应走便可以得到需要的二叉树。
四:算法本子
又到了喜闻乐见的模板时间了,这次写出来的是二叉树中的搜索
//首先我们先得有棵树叭
//先写结点
typedef struct node
{
int data;
struct node* left;
struct node* right;
} Node;
//再写树根
typedef struct
{Node* root;} Tree;
//现在就可以声明(构造)一棵树了
oid insert(Tree* tree,int value)
{
Node* node=(Node*)malloc(sizeof(Node));
node->data = value;
node->left = NULL;
node->right = NULL;
}
//一棵树的构造就完成了
但是搜索的核心在于哪里?
遍历!也就是所有的点都去找一遍,不管是树还是数组,都找一遍就能出来。
判断树是不是空树之类的代码就不写了,直接上遍历
void inorder(Node* node) { if (node != NULL) { inorder(node->left); printf("%d ",node->data); inorder(node->right); } }
这里用的是最常见的中序遍历,其他什么先序后序层次之类的遍历其实我也就听过...等碰到题的时候再说叭