第七章、图

❗7.1、图的定义和基本术语

7.1.1、定义

1、图

image-20231230205338227

❗1、完全图

image-20231230205446743

2、邻接()是无向图,<>是有向图、稠密图、稀疏图、网、关联(依附)

image-20231230205721748

3、度

①有几个边就是几个度

②如图

image-20231230205914460

4、有向树

①有且仅有1个顶点的入度(指向它的)

②其余顶点的入度均为1

③出度没限制

④就是有向树

5、路径相关概念

image-20231230210418923

6、连通图(强连通图是有向图)

(1)任意两点都找到路径是连通图

image-20231230210617474

7、权与网

image-20231230210650756

8、子图

image-20231230210852723

9、连通分量(强连通分量)

(1)连通子图,是子图,也两点任意访问

(2)极大连通:是指该顶点已经最大了,再加子图就不连通了

(3)无向图

image-20231230211046546

(4)有向图

image-20231230211207829

10、极小连通子图

(1)与极大连通子图对应

11、生成树

(1)包含无向图G所有定点的极小连通子图

image-20231230211342794

7.2、案例引入

7.2.1、六度空间理论

image-20231230211409755

7.3、图的类型定义

7.3.1、图的抽象数据类型定义

1、定义

image-20231230211508097

2、操作

image-20231230211705579

❗7.4、图的存储结构

1、介绍

image-20231230211858025

❗7.4.1、数组(邻接矩阵)表示法

1、如果存在关系则用1表示,否则为0

image-20231230212041098

2、无向图的邻接矩阵图

①有几个顶点,就有i*j的矩阵

②矩阵的对角线是0,因为都表示自己

image-20231230212507779

3、有向图的邻接矩阵表示法

①有几个顶点,就有i*j的矩阵

②矩阵的对角线是0,因为都表示自己

③i行和j列的含义

image-20231230212805670

④分析1:有向图的邻接矩阵可能不是对称的(除非是完全图)

⑤分析2:

image-20231230212957574

⑥出度:该结点指向的方向(箭头出发的方向)

⑦入度:其他结点指向自己

4、网(即有权图)的邻接矩阵表示法

image-20231230213251339

2、邻接矩阵的存储

1、两个数组分别存储顶点表和接邻矩阵

2、存储结构

image-20231230213541753

3、思路

image-20231230215104360

3、java实现代码

1、无向图邻接矩阵

import java.util.ArrayList;
import java.util.Arrays;

public class Graph {
    public static void main(String[] args) {
        int n = 5;//节点个数
        String vertextValue[] = {"A","B","C","D","E"};
        //创建对象
        Graph graph = new Graph(n);
        //循环添加顶点
        for(String value : vertextValue){
            graph.inserVetex(value);
        }

        //添加边
        graph.install(0,1,1);
        graph.install(0,2,1);
        graph.install(1,2,1);
        graph.install(1,3,1);
        graph.install(1,4,1);
        //显示邻接矩阵
        graph.showGraph();

    }
    private ArrayList<String> vertexList;//设置存储节点的集合
    private int [][] edges;//用来存储矩阵
    private int numOfEdges;//存储节点的边数

    //构造器
    public Graph(int n ){
        //初始化c存储矩阵
        edges = new int[n][n];
        vertexList = new ArrayList<>(n);//设置n个节点集合
        numOfEdges = 0;
    }

    //显示图对应的矩阵
    public void showGraph(){
        for(int[] link :edges){
            System.out.println(Arrays.toString(link));
        }
    }

    //得到顶点的个数
    public int getNumOfVertex(){
        return vertexList.size();
    }

    //得到边的数目
    public int getNumOfEdges(){
        return numOfEdges;
    }

    //得到节点i(下标)对应的数据
    public String getValueByIndex(int i){
        return vertexList.get(i);
    }

    //添加边
    public void install(int v1 ,int v2,int weight){//v1是第一个顶点,v2是第二个顶点
        edges[v1][v2] = weight;
        edges[v2][v1] = weight;
        numOfEdges++;
    }

    //添加顶点
    public void inserVetex(String vertex){
        vertexList.add(vertex);
    }
}
4、采用连接矩阵表示法的创建无向图
5、邻接矩阵的优点

(1)有向表中:行—出度

(2)有向表中:列—入度

image-20231230215928928

6、邻接矩阵的缺点

image-20231230215935824

❗7.4.2、邻接表表示法(链式)

1、分析

image-20231230220138783

2、无向图的邻接表

1、计算无向表的度,通过有多少个表结点

2、存放的位置不怕

3、特点

image-20231230220516747

3、有向图的邻接表

1、有几个表结点,就有几个出度

2、找入度需要遍历

3、出度容易入度难

image-20231230232833149

逆邻接表

y①有几个表结点,就有几个入度

②找出度需要遍历,找到邻接点是0的

③入度容易出度难

④如图

image-20231230232950652

4、练习题

image-20231230233103363

5、图的邻接表存储结构

1、顶点的结点结构

image-20231230233403777

2、弧(边)的结点结构

image-20231230233548620

3、图的结点定义

image-20231230233608609

6、邻接表代码思路

image-20231230233837108

7、java代码实现
8、邻接表的优点和缺点

image-20240415004207579

9、邻接矩阵和邻接表表示法的关系

1、联系

image-20240415004222970

2、区别

image-20240415004233058

7.4.3、十字链表、邻接多重表

image-20240415004253393

1、解析(十字链表)

image-20240415004331493

2、解析(邻接多重表)

1、边结点画在哪不重要

image-20240415004414364

❗7.5、图的遍历

7.5.1、定义

1、从已给连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每一个顶点被访问一次,就叫做图的遍历。

2、遍历是图的基本运算

3、遍历实质:找到每个顶点的邻接点的过程

7.5.2、特点

image-20240415004431008

7.5.3、图的常用遍历

7.5.3、深度优先搜索(Depth_First Search—DFS)

1、方法

image-20240415004447426

1、一条路走到黑,到了尽头,回退。直到回退到起始顶点。

2、例子

image-20240415004503399

3、邻接矩阵表示的无向图深度遍历实现

1、解析

image-20240415004523204

2、代码

image-20240415004537420

3、java代码实现

4、DFS算法效率分析

image-20240415004550145

5、非连通图的遍历

image-20240415004607756

7.5.4、广度优先搜素(Breadth_First Search—BFS)

1、方法

image-20240415004625639

1、是一圈一圈的遍历

2、非连通图的遍历

image-20240415004642688

3、邻接表实现

1、思路

2、实现

4、BFS算法效率
5、DFS和BFS算法效率比较

7.6、图的应用

7.6.1、最小生成树

1、概念

1、最小生成树:所有顶点均由边连接在一起,且不形成回路。

2、特点

(1)含n个顶点n-1条边的图不一定是生成树,(也可能是森林)

2、无向图的生成树

image-20240415004722490

3、最小生成树

image-20240415004737476

4、最小生成树的典型例子

image-20240415004747211

5、构造最小生成树Minimum Spanning Tree

1、性质

image-20240415004758818

2、对MST性质的解释

image-20240415004808430

6、最小生成树算法之一—普里姆(Prim)算法

1、算法思路

image-20240415004818367

7、最小生成树算法之一—克鲁斯卡尔(Kruskal)算法

1、算法思路

image-20240415004831146

8、两种算法的比较

image-20240415004841656

7.6.2、最短路径

1、介绍

1、问题抽象

image-20240415004900127

2、第一类问题:两点间的最短路径

image-20240415004909827

3、第二类问题:某源点到其他各点最短路径

image-20240415005028081

4、最短路径算法—Dijistra算法

image-20240415005113046

7.7、案例分析与实现

未完待续

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇