图论基础和表示

news2024/11/25 16:36:03

一、概念及其介绍

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

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

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

 

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

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

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

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

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

二、适用说明

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

三、图的表达形式

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

 

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

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

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

Java 实例代码

 (1) 邻接矩阵

package guanh.graph;

/**
 * 邻接矩阵
 */
public class DenseGraph {
    // 节点数
    private int n;
    // 边数
    private int m;
    // 是否为有向图
    private boolean directed;
    // 图的具体数据
    private boolean[][] g;

    // 构造函数
    public DenseGraph( int n , boolean directed ){
        assert n >= 0;
        this.n = n;
        this.m = 0;
        this.directed = directed;
        // g初始化为n*n的布尔矩阵, 每一个g[i][j]均为false, 表示没有任和边
        // false为boolean型变量的默认值
        g = new boolean[n][n];
    }
    // 返回节点个数
    public int V(){ return n;}
    // 返回边的个数
    public int E(){ return m;}

    // 向图中添加一个边
    public void addEdge( int v , int w ){
        assert v >= 0 && v < n ;
        assert w >= 0 && w < n ;
        if( hasEdge( v , w ) )
            return;
        g[v][w] = true;
        if( !directed )
            g[w][v] = true;
        m ++;
    }

    // 验证图中是否有从v到w的边
    boolean hasEdge( int v , int w ){
        assert v >= 0 && v < n ;
        assert w >= 0 && w < n ;
        return g[v][w];
    }
}

 (2)邻接表

package guanh.graph;

import java.util.Vector;

/**
 * 邻接表
 */
public class SparseGraph {
    // 节点数
    private int n;
    // 边数
    private int m;
    // 是否为有向图
    private boolean directed;
    // 图的具体数据
    private Vector<Integer>[] g;

    // 构造函数
    public SparseGraph( int n , boolean directed ){
        assert n >= 0;
        this.n = n;
        this.m = 0;  
        this.directed = directed;
        // g初始化为n个空的vector, 表示每一个g[i]都为空, 即没有任和边
        g = (Vector<Integer>[])new Vector[n];
        for(int i = 0 ; i < n ; i ++)
            g[i] = new Vector<Integer>();
    }
    // 返回节点个数
    public int V(){ return n;}
    // 返回边的个数
    public int E(){ return m;}
    // 向图中添加一个边
    public void addEdge( int v, int w ){
        assert v >= 0 && v < n ;
        assert w >= 0 && w < n ;
        g[v].add(w);
        if( v != w && !directed )
            g[w].add(v);
        m ++;
    }

    // 验证图中是否有从v到w的边
    boolean hasEdge( int v , int w ){

        assert v >= 0 && v < n ;
        assert w >= 0 && w < n ;

        for( int i = 0 ; i < g[v].size() ; i ++ )
            if( g[v].elementAt(i) == w )
                return true;
        return false;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/621818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python开源免费——为什么它是SEO世界的最佳选择

Python开源免费——为什么它是SEO世界的最佳选择 介绍 Python是一种流行的程序设计语言&#xff0c;拥有众多的开源库和响应式社区。它广泛应用于机器学习、数据科学、Web开发、系统自动化等领域。Python不仅易于学习和使用&#xff0c;而且完全免费并且开源&#xff0c;使得…

Linux线程的同步与互斥(二) 条件变量+信号量

文章目录 二、线程同步条件变量1、条件变量的概念2、同步概念与竞态条件3、条件变量函数初始化4、条件变量函数销毁5、条件变量函数等待6、条件变量函数唤醒等待生产者消费者模型1、理论部分2、“3 2 1”原则3、基于阻塞队列的生产者消费者模型 POSIX信号量1、信号量的概念2、信…

时间序列学习 经典案例(5)【stability_selection】股票数据特征分析与特征选择

0.环境配置 本文用到的环境是&#xff1a; jupyter 略python 3.9stability_selection 略&#xff0c;见下文。scikit-learn 1.2.2seaborn 0.12.2pandas 1.3.5numpy 1.22.3matplotlib 3.6.3tushare 1.2.89baostock 00.8.80yfinance 0.2.18 1.stability_selection模块安装【问…

【MySQL数据库 | 番外篇】 聚合函数

前言&#xff1a; 聚合函数是分组查询中一个重要的组成部分&#xff0c;想要利用分组查询&#xff0c;就要对聚合函数有不错的掌握&#xff0c;因此我们在这里开一篇番外&#xff0c;讲解SQL语法中的聚合函数 聚合函数&#xff1a; 聚合函数是SQL中一种特殊的函数&#xff0c;…

大模型信息提取、文本生成、视觉语音应用

448页新书《基础模型自然语言处理》&#xff0c;详述大模型在信息提取文本生成视觉语音应用。 Dr. Gerhard Paa 等人合著的《Foundation Models for Natural Language Processing》 一书系统介绍基础模型研究和应用的全面概述&#xff0c;而且是目前对此方面研究最新的综述。 …

【Java】Java核心要点总结:59

文章目录 1. 线程的run()和start()有什么区别&#xff0c;为什么不直接调用run()2. synchronized是什么&#xff0c;以及原理3. Java中如何实现多线程的通讯和协作4. Volatile有什么特点&#xff0c;为什么能够保证变量的可见性5. 为什么说synchronized是一个悲观锁&#xff0c…

chatgpt赋能python:Python开发环境的下载方法

Python开发环境的下载方法 Python是一种高级的编程语言&#xff0c;受到广泛的社区和商业支持。它用于数据分析、人工智能和Web开发等领域&#xff0c;成为业界最流行的编程语言之一。搭建Python开发环境需要安装解释器、编辑器、包管理器和库&#xff0c;下面介绍Python开发环…

chatgpt赋能python:用Python开发在线电影播放网站如何进行SEO

用Python开发在线电影播放网站如何进行SEO 随着人们对于电影、电视剧等视频娱乐的需求日益增长&#xff0c;越来越多的在线电影播放网站涌现出来。作为开发者&#xff0c;如何通过搜索引擎优化&#xff08;SEO&#xff09;来使你的在线电影播放网站具有更好的可见度&#xff0…

chatgpt赋能python:如何更新Python库?

如何更新Python库&#xff1f; Python语言已经成为现代编程语言中最受欢迎的一种&#xff0c;它的成功归功于它的灵活性、简洁性和可读性。Python库是它成功的关键&#xff0c;这些库是程序员的基本工具箱&#xff0c;可以更快地编写、测试和部署程序。 然而&#xff0c;Pyth…

多分类问题

目录 多分类问题介绍1 多分类1.1 数据集1.2 数据可视化1.3 逻辑回归的向量化1.3.1 代价函数的向量化1.3.2 梯度的向量化1.3.3 正则化逻辑回归的向量化 1.4 多分类-分类器 1.5 使用分类器进行预测 多分类问题 介绍 在本练习中&#xff0c;我们将使用逻辑回归来识别手写数字&…

python安装使用Flask框架(Vscode)

编译器&#xff1a;VsCode&#xff0c;python3.** 首先安装&#xff0c;在终端输入 pip install flask安装成功后新建文件&#xff0c;app.python&#xff0c;创建一个简单的Web应用。 from flask import Flaskapp Flask(__name__)app.route(/) def hello():return Hello, …

chatgpt赋能python:Python平均值命令在数据处理中的应用

Python平均值命令在数据处理中的应用 Python是一门广泛应用于数据分析和数据处理的编程语言。在数据处理中&#xff0c;我们常常需要计算数据的平均值。Python中提供了多种方法来计算平均值&#xff0c;比如使用内置函数mean()或使用numpy库中的mean()函数等。本文将着重介绍P…

Vue封装API,详细解释。

1、为什么我们要封装API ps: 如果已经有了明确要封装API的需求&#xff0c;直接看第二步。 在没有封装API之前&#xff0c;我们是类似这样使用 axios 的 this.$axios.post(blogArticle/frontList,parms).then((resp) > { this.blogList resp.data, this.blogTota…

【玩转Linux操作】Linux常用文件管理命令

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 目录 ​编辑 &#x1f381;ctrlc &#x1f381;ctrlu &#x1f381;t…

chatgpt赋能python:Python平均分函数:简介和使用方法

Python平均分函数&#xff1a;简介和使用方法 如果您正在寻找如何计算Python中多个数字值的平均分数的方法&#xff0c;请继续阅读。本文将为您介绍Python中平均分函数的用途和使用方法。 什么是平均分函数&#xff1f; Python的平均分函数是一个计算多个数字值的平均值的函…

分享可以在线录音实时转写的方法

小伙伴们使用过录音记录吗&#xff1f;那知道录音实时转写吗&#xff1f;有没有听说过这个功能呢&#xff1f;它是可以通过语音识别技术&#xff0c;将录音中的信息快速转换为文本&#xff0c;并实现实时显示输出的功能。听起来是不是很有趣&#xff1f;而且它无需任何专业设备…

线程,你是个什么?

线程的基本定义 线程&#xff08;Thread&#xff09;是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程&#xff08;Process&#xff09;中&#xff0c;是进程中的实际运作单位。一个线程可以与同一进程中的其他线程共享进程的全部资源&#xff0c;包括内存、文…

深入浅出讲解闭包及其原理

闭包 什么是闭包&#xff1f; 闭包的概念并不复杂&#xff0c;但是它的定义比较绕&#xff08;就像平时经常用到它&#xff0c;却又说不出来是什么&#xff09;。可以在一个作用域中调用函数的内部函数并访问到该函数中的作用域的成员&#xff0c;这就是闭包。给一个建议&…

springboot整合swagger3

目录 一、导入swagger3的依赖二、SwaggerConfig代码的解读三、整体代码四、访问swagger3 一、导入swagger3的依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</versi…

【算法与数据结构】209.长度最小的子数组

文章目录 题目一、暴力穷解法二、滑动窗口法完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 题目 一、暴力穷解法 思路分析&#xff1a;这道题涉及到数组求和&#xff0c;那么我们很容易想到利用两个for循环来写&#xff0c;…