基本概念:
- 路径:一个顶点序列w1,w2,…,wN使得(wi,wi+1)属于E(边的集合),
1<=i<N
- 路径的长:该路径上的边数,即N-1
- 简单路径:这条路径上所有定点都是互异的,但第一个和最后一个可能相同
- 有向图中的圈:满足w1=wN且长至少为1的一条路径(如果是简单路径称为简单图)
- 连通:在一个无向图中,从每个定点到每个其他顶点都存在一条路径
- 强连通:具有连通性的有向图
- 弱连通:一个有向图不是强连通图,但它的基础图是连通的
- 完全图:每一对顶点间都存在一条边的图
图的的表示:
- 邻接矩阵(适合稠密图):对每条边(u,v)置A[u][v]为true,否则为false,或者在其中放入该权值【邻接矩阵的空间需求为v的平方】
- 邻接表(图的基本表示方法):对于每一个顶点,使用一个表存放所有邻接的顶点,如果边有权,这个附加信息也可以存储在邻接表中。(邻接表本身可以被保存在任何中了的List)【邻接表的空间需求为E+V】
最短路径算法:
无权最短路径:
- 广度优先搜索(BFS):该方法按照层处理顶点,距离开始顶点最近的那些点首先被求值,而最远的那些顶点最后被求值(这很像对树的层序遍历)
广度优先搜索的详细介绍:http://blog.csdn.net/Wee_Mita/article/details/71077097 - Dijkstra算法(一种贪心算法):
Dijkstra算法的详细介绍:http://blog.csdn.net/Wee_Mita/article/details/71077104
PS:贪心算法:一般分阶段求解问题,在每个阶段把出现的当做最好的处理。
最小生成树:
一个无向图的最小生成树就是由该图的那些连接G的所以顶点的边构成的树,且其总价值最低(最小生成树存在当且仅当G是连通的)
- Prim算法:在每一步中都要把一个节点当做根,并往上加边,这样就把相关联的顶点家都增长的树上
- Kruskal算法:连续选择权值最小的边,并且当所选的不产生圈时,就把它作为所取定的边