【数据结构】图 总结

一些重点概念

  • 无向完全图边数 e = n ( n − 1 ) 2 . e=\frac{n(n-1)}{2}. e=2n(n1).有向完全图边数 n ( n − 1 ) . n(n-1). n(n1).
  • 顶点v的度指的是相关联的边数,TD(v).有向图要分两部分:出度ID(v)和入度OD(v).度数/2是边数
  • 简单路径:路径的顶点序列中的顶点各不相同。简单回路:除了第一和最后一个顶点外,不出现相同的顶点。
  • 连通图:在无向图中,任意两个顶点都连通,则是连通图。
  • 连通分量:无向图中的极大连通子图称为该无向图的连通分量。
  • 强连通图:在有向图中每对顶点从 v i v_i vi v j v_j vj和从 v j v_j vj v i v_i vi都有路径。
  • 生成树:一个连通图的生成树指一个极小连通子图,含有图中所有顶点,但只有足以构成一棵树的n-1条边,两顶点间仅有一条路径。

图的存储结构

(1)邻接矩阵

(2)邻接表

边表、表头链接表
链域、数据域、邻接点域
在这里插入图片描述

(3)邻接多重表

(4)十字链表

图的遍历

深度优先搜索

#define Error -1
#define Ok 1
int visited[MAX_VERTEX_MUM];
//遍历 图
void TraverseGraph(Graph g){
    for(vi=0;vi<g.vexnum;vi++){
        visited[vi]=0;
    }
    for(vi=0;vi<g.vexnum;vi++){
        if(!visited[vi])
            DepthFirstSearch(g,vi);
    }
}
//dfs
void DepthFirstSearch(Graph g,int v0){
    visit(v0);
    visited[v0]=1;
    w=FirstAdjVertex(g,v0); //找第一个邻接点
    while(w!=-1){ //邻接点存在
        of(!visited[w]) DepthFirstSearch(g,w);
        w=NextAdjVertex(g,v0,w); //找下一个邻接点
    }
}

邻接矩阵实现dfs

//邻接矩阵方式dfs
void DepthFirstSearch(AdjMatrix g,int v0){
    visit(v0);
    visited[v0]=1;
    for(vj=0;vj<g.vexnum;vj++){
        if(!visited[vj]&&g.arc[v0][vj].adj==1){
            DepthFirstSearch(g,vj);
        }
    }
}

邻接表实现dfs
在这里插入图片描述

//邻接表实现dfs
void DepthFirstSearch(AdjList g,int v0){
    visit(v0);
    visited[v0]=1;
    p=g.vertex[v0].firstarc;
    while(p!=NULL){
        if(!visited[p->adjvex])
            DepthFirstSearch(g,p->adjvex);
        p=p->nextarc;
    }
}

广度优先搜索

类似于树的层次遍历

//广度优先搜索
void BreadthFirstSearch(Graph g,int v0){
    visit(v0);
    visited[v0]=1;
    InitQueue(&Q);
    EnterQueue(&Q,v0);
    while(!Empty(Q)){
        DeleteQueue(&,&v); //队头出队
        w=FirstAdj(g,v); //求v的第一个邻接点
        while(w!=-1){
            if(!visited[w]){
                visit(w);
                visited[w]=1;
                EnterQueue(&Q,w);
                w=NextAdj(g,v,w);
            }
        }
    }
}

bfs原理:bfs原理分析图解
直接看这个文章即可!!!

最小生成树

普利姆算法

克鲁斯卡尔算法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.zwX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值