目录
1.图的表示
图的三种常用表示方法:
1.邻接矩阵 (容易看出和哪个点相邻)
2.邻接表 (便于增加和删除结点)
3.十字链表
2 图的遍历
1.DFS 深度优先遍历
先选定一个顶点v作为起始点,之后遍历v中第一个顶点中第一个相邻节点,一直遍历到最后,之后回来遍历第二个一直到最后,一直进行到最后全部遍历完。
(下面伪代码遍历邻接矩阵表示的图)
void DFS(AMGraph G, intv)
cout<<v; visited[v]=ture;
for(w=0;w<G.vexnum;w++)
if(G.arcs[v][w]!=0&&(!visted[w])) DFS(G,w);
2.BFS 广度优先
算法步骤:
1.从图中某个顶点v出发,访问v,并置visited[v]的值为ture,然后让v进队。
2.在队列不为空的前提下:
(1) 队头顶点u出队;
(2) 依次检查顶点u的所有邻接点,如果visited[w]=false,访问w,并将visited[w]=ture,然后将w入队。
void BFS(Graph G,int v)
{
cout<<v; visited[v]=true;
InitQueue(Q);
EnQueue(Q,v);
while(!QqueueEmpty(Q))
{
DeQueue(Q,u);
for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
if(!visited[w])
{
cout<<w;visited[w] = ture;
EnQueue(Q,w);
}
}
}
3 图论的几个常用的算法
1.最小生成树算法
(1)prim算法 对于图G(V,E)
first:首先定义一个集合,将起始的顶点加入这个集合U中,定义一个TE{}用于存放最小生成树的集合;
second: 在U和V-U中找到一个权值最小(u,w),其中u属于U,w属于V-U,把(u,w)加入到TE中,把w加入到U中;
third:一直重复second到U=V;
算法分析:算法复杂度为O(n**2) 与图中的边数无关,适合求稠密图;
(2)Kruskal算法 克鲁斯卡尔
适用于稀疏图;
以后补充
…………
…………
2.最短路径
(1)迪杰斯特拉算法
从初始点出发到图中各个顶点的最短路的求法;其中不能有负数;
算法步骤:
first:进行初始化
将起始点加入到S中,S[v]=ture;
将v到各个重点的最短路径长度初始化为权值,D[i]=G.arcs[v0][vi];
如果v和顶点vi之间有弧,则将vi的前驱置为v,即Path[i]=v;
second:重复n-1次
选择一个最小的vk,使得 D[k]=min{D[i]};
将vk加到S中,S[vk]=ture;
根据条件更新V-S上的任一顶点的最短路径的长度;
(2)弗洛伊德算法
以后补充………………