图论知识总结(简易)

目录

1.图的表示

2 图的遍历

3 图论的几个常用的算法


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)弗洛伊德算法

以后补充………………

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值