思维导图
重要概念
(1)图:图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中的顶点的集合,E是图G中边的集合。
(2)森林:一个有向图由若干棵有向树构成生成森林。
(3)图的邻接矩阵存储的结构:
typedef struct
{
char vexs[maxvex];
int arc[maxvex][maxvex];
int vertex,edges;
}MGraph;
(4)深度优先遍历(DFS):从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到。
void DFS(Vertex V)
{visited[V]=ture;
for(V的每个邻接点W)
if(!visited[W])
DFS(W);
}
(5)广度优先遍历(BFS):类似于树的层次遍历。
void BFS(Vertex V)
{visited[V]=ture;
Enqueue(V,Q);
while(!IsEmpty(Q)){
V=Dequeue(Q);
for(V的每个邻接点W)
if(!visited[W]){
visited[W]=true;
Enqueue(W,Q);
}
}
}
(6)最小生成树:构造连通网的最小代价生成树。
1.普里姆(prime):第一种:先将一个起点加入最小生成树,之后不断寻找与最小生成树相连的边权最小的边能通向的点,并将其加入最小生成树,直至所有顶点都在最小生成树中。
第二种:
1.将一个图的顶点分为两部分,一部分是最小生成树中的结点(A集合),另一部分是未处理的结点(B集合)。
2.首先选择一个结点,将这个结点加入A中,然后,对集合A中的顶点遍历,找出A中顶点关联的边权值最小的那个(设为v),将此顶点从B中删除,加入集合A中。
3.递归重复步骤2,直到B集合中的结点为空,结束此过程。
4.A集合中的结点就是由Prime算法得到的最小生成树的结点,依照步骤2的结点连接这些顶点,得到的就是这个图的最小生成树。
2.克鲁斯卡尔(kluskal):在剩下的所有未选取的边中,找最小边,如果和已选取的边构成回路,则放弃,选取次小边。
问题
1.用prim算法求最小生成树时,边上的权怎么不能为负?