数据结构与算法--图

06 图

6.1 相关定义和术语

  • 有向图

  • 无向图

  • 子图

6.2 图的存储结构

6.2.1 邻接矩阵

(1)用 n 阶方阵表示,当两个顶点有连接时,则相应位置元素置为 1。

#define Max_Vertex_Num 20   // 图中最大顶点数
typedef struct ArcCell
{
    int adj;     // 对无权图,用0、1表示是否相邻;对带权图,则为权值
    InfoType *info;      // 该弧相关信息指针(可无)
}ArcCell, AdjMatrix[Max_Vertex_Num][Max_Vertex_Num];

这里要注意,邻接矩阵中的元素是一个结构体,取元素时需多一步。

(2)表示图时,用一个一维数组表示各顶点的值,用邻接矩阵表示弧

typedef struct
{
    VertexType vexs[Max_Vertex_Num];    // 存储顶点值
    AdjMatrix arcs;                     // 邻接矩阵
    int vexnum, arcnum;                 // 存储顶点和弧的数目
}MGraph;

(3)无向图的邻接矩阵对阵,可压缩存储;有向图的邻接矩阵不一定对称(因为它可能是单向的)。

6.2.2 邻接表

弧结点

typedef struct Arcnode
{
    int adjvex;
    struct Arcnode *nextarc;
}ArcNode;

顶点结点

typedef struct Vnode
{
    VertexType data;
    ArcNode *firstarc;
}VNode, AdjList[Max_Vertex_Num];

图的定义

typedef struct
{
    AdjList vertices;
    int vexnum, arcnum;          // 顶点和弧的数目
}ALGraph;

6.3 图的遍历

6.3.1 深度优先遍历(DFS)

一条路走到底,走不动时,逐步返回,再进行遍历。

递归算法实现

void DFS(ALGraph G, int v)
{
    ArcNode *w;
    int i;
    printf("%d/t", v);
    visited[i]=1;
    w = G.vertices[v].firstarc;
    
    while(w)
    {
        i = w->adjvex;
        if(visited[i]==0)
            DFS(G, i);
        else w = w->nextarc;
    }
}


int visited[MAX];    // 初始值都置零

void DFSTraverse(ALGraph G)
{
    int i;
    for (int i=0; i<G.vexnum; i++)
        if(visited[i]==0)
            DFS(G, i);
}
6.3.2 广度优先遍历(BFS)

类似树的层次遍历。

6.3.3 深度优先生成树和广度优先生成树

6.4 拓扑排序

6.5 Djikstra 和 Floyd 算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值