首页 > 技术文章 > 第6章学习小结

C-ch3-5 2019-05-19 11:16 原文

一  学习小结

 

图的基本知识

1. 图分为无向图和有向图。若无向图有 n(n-1)/2 条边,则称之为无向完全图,若有向图有 n(n-1) 条弧,则称之为有向完全图

2. 带权图通常称为网 

3. :顶点v的度指和v相关联的边的数目,记为TD(v)   入度:以v为头的弧的数目   出度:以v为尾的弧的数目

4. 路径长度是一条路径上经过的边或弧的数目

5. 强连通图:在有向图G中,对于每一对vi,vj∈V,从vi到vj都存在路径

6. 连通生成树:一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边  其中各边代价之和(权)最小的那棵生成树成为最小生成树

 

图的存储

1. 邻接矩阵

#define MaxInt 32767  //表示极大值,即∞
#define MVNum 100    //最大顶点数
typedef char VerTexType;//假设顶点的数据类型为字符型
typedef int ArcType;        //假设边的权值类型为整型
typedef struct
{
    VerTexType Vexs[MVNum]; //顶点表
    ArcType arcs[MVNum] [MVNum]; //邻接矩阵
    int vexnum,arcnum;           //图的当前点数和边数
}AMGraph;

创建邻接矩阵的时间复杂度为O(n²)

2. 邻接表

#define MvNum 100       //最大顶点数 
typedef struct ArcNode    //边结点
{
    int adjvex;            //该边所指向的顶点的位置 
    struct ArcNode *nextarc;//指向下一条边的指针 
}ArcNode;

typedef struct VNode    //顶点信息
{
    VertexType data;
    ArcNode *firstarc;  //指向第一条依附该顶点的边的指针 
}VNode,AdjList[MvNum];  //AdjList表示邻接表类型

typedef struct
{
    AdjList Vertices;   //一维数组
    int vexnum,arcnum;  //图的当前顶点数和边数 
}Graph;

创建邻接矩阵的时间复杂度为O(n+e)    (顶点数+边数)

 

图的遍历

1. DFS 深度优先搜索

 从某个顶点v出发,遍历v所在的连通分量

2. BFS   广度优先搜索

 

 最小生成树

1. Prim算法  普里姆算法    —— 加点法

    时间复杂度 O(n²)   适用于稠密图

    主要步骤:在所有 u∈ U, v∈V-U 的边(u,v)属于E中找一条权值最少的边(u0,v0),并入集合TE(N上最小生成树中边的集合),同时v0并入U

2. Kruskal算法 克鲁斯卡尔算法 ——加边法

    时间复杂度 O(e log e) 适用于稀疏图

    初始状态为只有n个顶点而无边的非连通图 T = { V , { } }  每个顶点自成一个连通分量

    主要步骤:在E中选择权值最小的边,若该边依附的顶点落在不同连通分量上(即不形成回路),则将此边并入T,否舍去此边而选择下一条权值最小的边

 

最短路径:①路径上边的数目  ②路径上边的权值之和

1. Dijkstra算法  迪杰斯特拉算法

    

二  关于上次制定的目标和接下来的目标

 

这周没有合理安排时间大部分时间花在书面上,导致上机实践的时间大大缩水,很惭愧

下一周要先规划分配好时间,尽量保证足够的实操时间

推荐阅读