• 图论基础和表示


    一、概念及其介绍

    图论(Graph Theory)是离散数学的一个分支,是一门研究图(Graph)的学问。

    图是用来对对象之间的成对关系建模的数学结构,由"节点"或"顶点"(Vertex)以及连接这些顶点的"边"(Edge)组成。

    值得注意的是,图的顶点集合不能为空,但边的集合可以为空。图可能是无向的,这意味着图中的边在连接顶点时无需区分方向。否则,称图是有向的。下面左图是一个典型的无向图结构,右图则属于有向图。本章节介绍的图都是无向图。

    图的分类:无权图和有权图,连接节点与节点的边是否有数值与之对应,有的话就是有权图,否则就是无权图。

    图的连通性:在图论中,连通图基于连通的概念。在一个无向图 G 中,若从顶点 i 到顶点 j 有路径相连(当然从j到i也一定有路径),则称 i 和 j 是连通的。如果 G 是有向图,那么连接i和j的路径中所有的边都必须同向。如果图中任意两点都是连通的,那么图被称作连通图。如果此图是有向图,则称为强连通图(注意:需要双向都有路径)。图的连通性是图的基本性质。

    完全图:完全是一个简单的无向图,其中每对不同的顶点之间都恰连有一条边相连。

    自环边:一条边的起点终点是一个点。

    平行边:两个顶点之间存在多条边相连接。

    二、适用说明

    图可用于在物理、生物、社会和信息系统中建模许多类型的关系和过程,许多实际问题可以用图来表示。因此,图论成为运筹学、控制论、信息论、网络理论、博弈论、物理学、化学、生物学、社会科学、语言学、计算机科学等众多学科强有力的数学工具。在强调其应用于现实世界的系统时,网络有时被定义为一个图,其中属性(例如名称)之间的关系以节点和或边的形式关联起来。

    三、图的表达形式

    邻接矩阵:1 表示相连接,0 表示不相连。

    邻接表:只表达和顶点相连接的顶点信息

    邻接表适合表示稀疏图 (Sparse Graph)

    邻接矩阵适合表示稠密图 (Dense Graph)

    Java 实例代码

    (1) 邻接矩阵

    src/runoob/graph/DenseGraph.java 文件代码:

    1. package runoob.graph;
    2. /**
    3. * 邻接矩阵
    4. */
    5. public class DenseGraph {
    6. // 节点数
    7. private int n;
    8. // 边数
    9. private int m;
    10. // 是否为有向图
    11. private boolean directed;
    12. // 图的具体数据
    13. private boolean[][] g;
    14. // 构造函数
    15. public DenseGraph( int n , boolean directed ){
    16. assert n >= 0;
    17. this.n = n;
    18. this.m = 0;
    19. this.directed = directed;
    20. // g初始化为n*n的布尔矩阵, 每一个g[i][j]均为false, 表示没有任和边
    21. // falseboolean型变量的默认值
    22. g = new boolean[n][n];
    23. }
    24. // 返回节点个数
    25. public int V(){ return n;}
    26. // 返回边的个数
    27. public int E(){ return m;}
    28. // 向图中添加一个边
    29. public void addEdge( int v , int w ){
    30. assert v >= 0 && v < n ;
    31. assert w >= 0 && w < n ;
    32. if( hasEdge( v , w ) )
    33. return;
    34. g[v][w] = true;
    35. if( !directed )
    36. g[w][v] = true;
    37. m ++;
    38. }
    39. // 验证图中是否有从v到w的边
    40. boolean hasEdge( int v , int w ){
    41. assert v >= 0 && v < n ;
    42. assert w >= 0 && w < n ;
    43. return g[v][w];
    44. }
    45. }

    (2)邻接表

    src/runoob/graph/SparseGraph.java 文件代码:

    1. package runoob.graph;
    2. import java.util.Vector;
    3. /**
    4. * 邻接表
    5. */
    6. public class SparseGraph {
    7. // 节点数
    8. private int n;
    9. // 边数
    10. private int m;
    11. // 是否为有向图
    12. private boolean directed;
    13. // 图的具体数据
    14. private Vector<Integer>[] g;
    15. // 构造函数
    16. public SparseGraph( int n , boolean directed ){
    17. assert n >= 0;
    18. this.n = n;
    19. this.m = 0;
    20. this.directed = directed;
    21. // g初始化为n个空的vector, 表示每一个g[i]都为空, 即没有任和边
    22. g = (Vector<Integer>[])new Vector[n];
    23. for(int i = 0 ; i < n ; i ++)
    24. g[i] = new Vector<Integer>();
    25. }
    26. // 返回节点个数
    27. public int V(){ return n;}
    28. // 返回边的个数
    29. public int E(){ return m;}
    30. // 向图中添加一个边
    31. public void addEdge( int v, int w ){
    32. assert v >= 0 && v < n ;
    33. assert w >= 0 && w < n ;
    34. g[v].add(w);
    35. if( v != w && !directed )
    36. g[w].add(v);
    37. m ++;
    38. }
    39. // 验证图中是否有从v到w的边
    40. boolean hasEdge( int v , int w ){
    41. assert v >= 0 && v < n ;
    42. assert w >= 0 && w < n ;
    43. for( int i = 0 ; i < g[v].size() ; i ++ )
    44. if( g[v].elementAt(i) == w )
    45. return true;
    46. return false;
    47. }
    48. }
  • 相关阅读:
    【RocketMQ】【源码】延迟消息实现原理
    【经济研究】数字技术创新与中国企业高质量发展—来自企业数字专利的证据
    关于文件选择器 input type=file原生样式的优化
    db2数据库配置
    CSS Display(显示) 与 Visibility(可见性)
    Rb(redis blaster),一个为 redis 实现 non-replicated 分片的 python 库
    Vue太难啦!从入门到放弃day04——Vue组件
    OpenTiny 的这些特色组件,很实用,但你应该没见过
    WebGL HUD(平视显示器)
    大规模数据分析统一引擎Spark最新版本3.3.0入门实战
  • 原文地址:https://blog.csdn.net/weixin_45953332/article/details/133980525