ll_abc

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

图这章很快就学完了,学完发现印象最深刻的是邻接表和邻接矩阵还有深搜和广搜。

那接下来就重头捋捋我学习了什么。

一、图的术语

emm这些就不用细讲了,主要就是

1、生成树:极小连通子图,含有图中全部顶点,只有n-1条边。

2、极小生成树:权值最小的生成树。

 

二、构建图

1、基于邻接矩阵的存储:AMGraph

#define MVNum 100         //最大顶点数
typedef char VerTexType;  //顶点的数据类型
typedef int ArcType;         //边的权值类型
typedef struct {
    VerTexType vexs [MVNum]; //顶点表(一维数组)
    ArcType arcs [MVNum] [MUNum];  //邻接矩阵
    int vexnum, arcnum;     //顶点数及边数
} AMGraph;

 

(定义,建立,根据顶点名字查找其对应顶点表vexs的下标)

然后就是定义一个图 AMGraph g,  然后需要建立邻接矩阵,然后就要弄一个locate 函数在矩阵里找

缺点:稀疏图浪费空间。

2、基于邻接表的存储: ALGraph

typedef struct ArcNode   //
{
    int adjvex;        //该边指向顶点的位置
    struct ArcNode *nextarc;  //下一条边的指针
    quanzhi info;  //边权值
} ArcNode;

typedef struct VNode  //顶点信息
{
   VerTexType data;
   ArcNode *fiestarc   //第一条指该定点的边的指针
}VNode, AdjList [MVNum];  

typedef struct 
{
  AdjList verices; 
  int vexnum,arcnum; //顶点数 边数
}ALGraph;

 

跟邻接表类似,也是定义,建立,根据顶点名字查找顶点表

 

三、DFS & BFS

深度优先:找到一个顶点出发,访问v, 找出刚访问过的顶点的第一个未被访问的邻接点,访问该顶点,然后是以该顶点为新的,重复继续;

然后没有之后就返回;

void DFS(ALGraph G, int v) {
    ArcNode *p = new ArcNode;  
    int w = 0; 
    cout << G.vertices[v].data << endl;
    visited[v] = true;
    p = G.vertices[v].firstarc;
    while (p != NULL) {
        w = p->adjvex;
        if (visited[w] == false) {
            DFS(G, w);
        }
        p = p->nextarc;
    }
}

 

广度优先搜索:利用队列

起始顶点先入队 对于每一个准备入队的顶点

1、先访问再入队 对出队元素x 的每个邻接点做判断,如果为访问,则访问后入队。

2、直接入队  对出队元素x 先判断是否访问,访问后,x 的邻接点入队。(在出队时判断,会导致队列里多了许多不需要的)

 

然后就还学了求最小生成树的普里姆算法和克鲁斯卡算法

普里姆算法从顶点入手 时间复杂度 n*n  适用稠密图

克鲁斯卡尔算法则从边入手  时间复杂度 eloge 稀疏图

主要步骤就是刷新,找到最小权值

 

迪杰斯特拉算法 求最短路径

方法其实差不多,就是刷新时通过比较,然后找出最短的权值之和。

 

本周对于数据结构学习的也不是很周到,只是粗略地了解学习地内容,并没有深入研究,希望可以逐步培养起对计算机的兴趣,

因为没有兴趣,学习起来,很费劲,加油。

posted on 2019-05-19 20:41  ll_abc  阅读(112)  评论(0编辑  收藏  举报