表示图

表示一个图就是将它的顶点和边存储在程序中。用于存储图的数据结构是数组或列表。要编写处理和操作图形的程序,您必须在计算机中存储或表示图形的数据。

表示顶点

顶点可以存储在数组或列表中。例如,您可以使用以下数组存储下图中图表中的所有城市名称:

表示图

string[] vertices = {“西雅图”, “旧金山”, “洛杉矶”, “丹佛”, “堪萨斯城”, “芝加哥”, “波士顿”, “纽约”, “亚特兰大”, “迈阿密” 、“达拉斯”、“休斯顿”};

顶点可以是任何类型的对象。例如,您可以将城市视为包含名称、人口和市长等信息的对象。因此,您可以按如下方式定义顶点:

城市 city0 = new city(“西雅图”, 608660, “mike mcginn”);
…
城市 city11 = new city(“休斯顿”, 2099451, “安妮丝·帕克”);
city[] 顶点 = {city0, city1, … , city11};

公开课城市{
私有字符串城市名称;
私人人口;
私人字符串市长;

%ignore_pre_1%

对于 n 个顶点的图,可以使用自然数 0、1、2、…、n – 1 方便地标记顶点。因此,vertices[0]代表“西雅图”,vertices[1]代表“旧金山”,以此类推,如下图

表示图

您可以通过顶点的名称或索引来引用顶点,以更方便的为准。显然,在程序中通过索引访问顶点是很容易的。

表示边:边数组

边可以使用二维数组来表示。例如,您可以使用以下数组存储图 28.1 中图形中的所有边:

int[][] 边 = {
{0, 1}, {0, 3}, {0, 5},
{1, 0}, {1, 2}, {1, 3},
{2, 1}, {2, 3}, {2, 4}, {2, 10},
{3, 0}, {3, 1}, {3, 2}, {3, 4}, {3, 5},
{4, 2}, {4, 3}, {4, 5}, {4, 7}, {4, 8}, {4, 10},
{5, 0}, {5, 3}, {5, 4}, {5, 6}, {5, 7},
{6, 5}, {6, 7},
{7, 4}, {7, 5}, {7, 6}, {7, 8},
{8, 4}, {8, 7}, {8, 9}, {8, 10}, {8, 11},
{9, 8}, {9, 11},
{10, 2}, {10, 4}, {10, 8}, {10, 11},
{11, 8}, {11, 9}, {11, 10}
};

这种表示称为边缘数组。下图(a)中的顶点和边可以表示如下:

string[] 名称 = {“peter”, “jane”, “mark”, “cindy”, “wendy”};
int[][] 边 = {{0, 2}, {1, 2}, {2, 4}, {3, 4}};

表示图

表示边缘:边缘对象

表示边的另一种方法是将边定义为对象并将边存储在java.util.arraylist中。 edge 类可以定义如下:

公开课边缘{
int你;
int v;
公共边(int u,int v){
这个.u = u;
这个.v = v;
}
公共布尔等于(对象o){
返回 u == ((edge)o).u && v == ((edge)o).v;
}
}

例如,您可以使用以下列表存储下图中图中的所有边:

java.util.arraylist list = new java.util.arraylist();
list.add(new edge(0, 1));
list.add(new edge(0, 3));
list.add(new edge(0, 5));
…

表示图

如果您事先不知道边缘,那么将 edge 对象存储在 arraylist 中非常有用。

虽然在上一节(表示边缘:边缘数组)和本节前面使用边缘数组或edge对象表示边缘对于输入来说可能很直观,但对于内部处理来说效率不高。接下来的两节介绍使用邻接矩阵和邻接列表来表示图。这两种数据结构对于处理图形非常有效。

表示边:邻接矩阵

假设该图有 n 个顶点。您可以使用二维 n * n 矩阵(例如adjacencymatrix)来表示边缘。数组中的每个元素是0或1。如果从顶点i到顶点j有一条边,adjacencymatrix[i][j]是1;否则,adjacencymatrix[i][j] 是0。如果图是无向的,则矩阵是对称的,因为 adjacencymatrix[i][j] 与 adjacencymatrix[j][i] 相同。例如,下图中图中的边可以使用邻接矩阵表示,如下所示:

int[][] 邻接矩阵 = {
{0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0}, // 西雅图
{1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, // 旧金山
{0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0}, // 洛杉矶
{1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0}, // 丹佛
{0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0}, // 堪萨斯城
{1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0}, // 芝加哥
{0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0}, // 波士顿
{0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0}, // 纽约
{0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1}, // 亚特兰大
{0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1}, // 迈阿密
{0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1}, // 达拉斯
{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0} // 休斯顿
};

由于矩阵对于无向图是对称的,为了节省存储空间,您可以使用不规则数组。

爱图表 爱图表

AI驱动的智能化图表创作平台

爱图表 99 查看详情 爱图表

下图(a)中的有向图的邻接矩阵可以表示如下:

int[][] a = {{0, 0, 1, 0, 0}, // 彼得
{0, 0, 1, 0, 0}, // 简
{0, 0, 0, 0, 1}, // 标记
{0, 0, 0, 0, 1}, // 辛迪
{0, 0, 0, 0, 0} // 温蒂
};

表示图

表示边:邻接表

您可以使用邻接顶点列表或邻接边列表来表示边。顶点 i 的邻接顶点列表包含与 i 相邻的顶点,顶点 i 的邻接边列表包含与 i 相邻的边。您可以定义一个列表数组。
数组有 n 个条目,每个条目都是一个列表。顶点 i 的邻接顶点列表包含所有顶点 j,使得存在从顶点 i 到顶点 j 的边。例如,要表示下图中图形中的边,您可以创建一个列表数组,如下所示:

java.util.list[] neighbors = new java.util.list[12];

表示图

neighbors[0] 包含与顶点 0(即西雅图)相邻的所有顶点,neighbors[1] 包含与顶点 1(即旧金山)相邻的所有顶点,依此类推,如图所示如下图所示。

表示图

为了表示下图中图形的邻接边列表,您可以创建一个列表数组,如下所示:

java.util.list[] neighbors = new java.util.list[12];

表示图

neighbors[0] 包含与顶点 0(即西雅图)相邻的所有边,neighbors[1] 包含与顶点 1(即旧金山)相邻的所有边,依此类推,如图所示如下图所示。

表示图

您可以使用邻接矩阵或邻接列表来表示图。哪一个更好?如果图很密集(即有很多边),则首选使用邻接矩阵。如果图非常稀疏(即边很少),则使用邻接列表更好,因为使用邻接矩阵会浪费大量空间。

邻接矩阵和邻接表都可以在程序中使用,以使算法更加高效。例如,使用邻接矩阵检查两个顶点是否连接需要 o(1) 常量时间,使用邻接列表打印图中的所有边需要线性时间 o(m),其中 m 是边数.

邻接顶点列表对于表示未加权图来说更简单。然而,邻接边列表对于各种图形应用来说更加灵活。使用邻接边列表可以轻松地在边上添加额外的约束。因此,本书将使用邻接边列表来表示图。

可以使用数组、数组列表或链表来存储邻接表。我们将使用列表而不是数组,因为列表可以轻松扩展以允许您添加新顶点。此外,我们将使用数组列表而不是链表,因为我们的算法只需要搜索列表中的相邻顶点。使用数组列表对于我们的算法来说更有效。使用数组列表,可以如下构建下图中的邻接边列表:

list<arraylist> 邻居 = new arraylist();
neighbors.add(new arraylist());
neighbors.get(0).add(new edge(0, 1));
neighbors.get(0).add(new edge(0, 3));
neighbors.get(0).add(new edge(0, 5));
neighbors.add(new arraylist());
neighbors.get(1).add(new edge(1, 0));
neighbors.get(1).add(new edge(1, 2));
neighbors.get(1).add(new edge(1, 3));
…
…
neighbors.get(11).add(new edge(11, 8));
neighbors.get(11).add(new edge(11, 9));
neighbors.get(11).add(new edge(11, 10));

表示图

以上就是表示图的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/824799.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
动态网页设计php它的开发环境有哪些
上一篇 2025年11月27日 05:01:03
小米15 Ultra最后一代6499元!卢伟冰:小米手机要突破6K+超高端市场
下一篇 2025年11月27日 05:01:05

相关推荐

  • Safari浏览器如何重置到初始设置_Safari浏览器恢复默认出厂设置操作

    Safari浏览器如何重置到初始设置_Safari浏览器恢复默认出厂设置操作Safari浏览器如何重置到初始设置_Safari浏览器恢复默认出厂设置操作Safari浏览器如何重置到初始设置_Safari浏览器恢复默认出厂设置操作Safari浏览器如何重置到初始设置_Safari浏览器恢复默认出厂设置操作

    重置Safari可解决运行缓慢、加载异常等问题。首先通过Safari偏好设置清除历史记录与网站数据,并恢复各项功能至默认值;若问题依旧,可使用终端命令删除偏好文件及缓存实现深度重置;也可通过系统设置一次性清除所有浏览数据与扩展信息,重启后恢复初始状态。 如果您发现Safari浏览器运行缓慢、页面加载…

    2026年9月26日 • 用户投稿
    100
  • 检查型异常(Checked Exception)和非检查型异常(Unchecked Exception)的区别?

    检查型异常(Checked Exception)和非检查型异常(Unchecked Exception)的区别?检查型异常(Checked Exception)和非检查型异常(Unchecked Exception)的区别?检查型异常(Checked Exception)和非检查型异常(Unchecked Exception)的区别?检查型异常(Checked Exception)和非检查型异常(Unchecked Exception)的区别?

    检查型异常由编译器强制处理,代表可预期的外部问题,如文件不存在;非检查型异常为运行时异常,通常由程序逻辑错误引起,编译器不强制捕获。前者需显式处理或声明,体现健壮性设计;后者应通过预防避免,体现“快速失败”原则。自定义异常时,若调用方可恢复或需处理,应继承Exception;若为内部错误,则继承Ru…

    2026年9月26日 • 用户投稿
    000
  • 顶级学术会议MICCAI最高奖项披露,华人科学家首次获奖!

    顶级学术会议MICCAI最高奖项披露,华人科学家首次获奖!顶级学术会议MICCAI最高奖项披露,华人科学家首次获奖!顶级学术会议MICCAI最高奖项披露,华人科学家首次获奖!顶级学术会议MICCAI最高奖项披露,华人科学家首次获奖!

    9 月 23 日至 27 日,2025 年国际医学影像计算与计算机辅助介入协会(miccai)年会在韩国隆重举行。在此期间,上海科技大学生物医学工程学院创始院长、联影智能联席 ceo 沈定刚荣获大会颁发的 miccai enduring impact award (eia) 持久影响力奖,成为该奖项…

    2026年9月26日 • 用户投稿
    000
  • 2025高分辨率图片生成AI工具Top10榜单

    2025年高分辨率AI图像生成工具将实现技术突破,榜单预测包括DeepImage AI Pro 2025、NVIDIA AI Imaginer 5.0等十款产品,涵盖生成质量、速度、细节控制、Prompt理解与软件兼容性五大维度;当前技术瓶颈集中在计算资源需求大、算法优化难、数据标注成本高,而未来趋…

    2026年9月26日
    200
  • synchronized 关键字的实现原理是什么?它是如何保证线程安全的?

    synchronized 关键字的实现原理是什么?它是如何保证线程安全的?synchronized 关键字的实现原理是什么?它是如何保证线程安全的?synchronized 关键字的实现原理是什么?它是如何保证线程安全的?synchronized 关键字的实现原理是什么?它是如何保证线程安全的?

    synchronized 是 Java 中保证线程安全的核心机制,其本质是通过 JVM 内置的 Monitor(监视器)实现互斥访问。当多个线程竞争同步资源时,synchronized 依靠对象头中的 Mark Word 和锁升级机制(偏向锁 → 轻量级锁 → 重量级锁)动态调整锁的实现方式,以平衡…

    2026年9月26日 • 用户投稿
    100
  • Java 8中的Stream API有哪些常用操作?它是惰性求值的吗?

    Java 8中的Stream API有哪些常用操作?它是惰性求值的吗?Java 8中的Stream API有哪些常用操作?它是惰性求值的吗?Java 8中的Stream API有哪些常用操作?它是惰性求值的吗?Java 8中的Stream API有哪些常用操作?它是惰性求值的吗?

    答案:Java 8的Stream API通过中间操作和终端操作实现惰性求值,提升性能与代码可读性。中间操作如filter、map返回新流且惰性执行,终端操作如forEach、collect触发计算并产生结果。惰性求值避免不必要的计算,支持短路操作,优化管道处理,适用于无限流。使用时需避免副作用、重复…

    2026年9月26日 • 用户投稿
    100
  • 谈谈你对Java平台的理解,什么是“一次编写,到处运行”?

    谈谈你对Java平台的理解,什么是“一次编写,到处运行”?谈谈你对Java平台的理解,什么是“一次编写,到处运行”?谈谈你对Java平台的理解,什么是“一次编写,到处运行”?谈谈你对Java平台的理解,什么是“一次编写,到处运行”?

    Java虚拟机(JVM)是实现“一次编写,到处运行”的核心,它通过将Java字节码翻译为特定平台的机器码,屏蔽了底层差异,实现跨平台兼容;同时JVM提供内存管理、垃圾回收和JIT编译等机制,保障程序的高效与稳定运行。尽管存在JNI依赖、UI差异、性能波动和环境配置等挑战,Java仍凭借其强大生态在企…

    2026年9月26日 • 用户投稿
    000
  • 新机遇、新体验、新服务,HarmonyOS 游戏领启未来

    新机遇、新体验、新服务,HarmonyOS 游戏领启未来新机遇、新体验、新服务,HarmonyOS 游戏领启未来新机遇、新体验、新服务,HarmonyOS 游戏领启未来新机遇、新体验、新服务,HarmonyOS 游戏领启未来

    【中国,上海,2025年7月31日】2025年中国国际数字娱乐产业大会(cdec)高峰论坛顺利举行。华为终端云服务互动媒体bu总裁张思建在题为《技术赋能体验创新 harmonyos 游戏领启未来》的演讲中指出,随着harmonyos 5设备数量突破千万大关,鸿蒙系统5已成功通过大规模市场验证,整体用…

    2026年9月26日 • 用户投稿
    400
  • 率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元

    率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元率先完成 30TB 硬盘测试,希捷携手百度开启 AI 存储新纪元

    在人工智能技术迅猛发展的背景下,从大规模模型训练到广泛的边缘计算应用,数据以前所未有的速度不断产生。根据 idc 的预测,至 2028 年全球将生成高达 394zb 的数据,其中生成式 ai 贡献超过 100zb。面对如此庞大的数据体量,如何实现安全存储与高效管理,成为亟需解决的关键问题。对于承载数…

    2026年9月26日 • 用户投稿
    100
  • 豆包AI是否能生成代码 豆包代码生成功能及其适用范围分析

    本文将围绕豆包AI是否能生成代码这一问题展开探讨。我们将首先确认其代码生成能力,随后详细讲解如何有效利用此功能,并通过步骤拆解,帮助用户掌握操作过程。最后,会分析该功能的适用场景与潜在局限,以便用户能更全面地理解和运用。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Deep…

    2026年9月26日
    100
  • 如何利用Nginx日志进行安全监控

    如何利用Nginx日志进行安全监控如何利用Nginx日志进行安全监控如何利用Nginx日志进行安全监控如何利用Nginx日志进行安全监控

    保障网站和应用安全,Nginx日志安全监控至关重要。本文将详细介绍关键步骤和最佳实践。 一、Nginx日志配置与启用 默认配置: Nginx通常已启用访问日志和错误日志记录。请确保日志文件配置正确并妥善存储。日志格式: 建议使用标准日志格式,方便后续分析。例如: log_format main ‘$…

    2026年9月26日 • 用户投稿
    000
  • 构建健壮的Java用户输入:Scanner整数解析与异常捕获

    构建健壮的Java用户输入:Scanner整数解析与异常捕获构建健壮的Java用户输入:Scanner整数解析与异常捕获构建健壮的Java用户输入:Scanner整数解析与异常捕获构建健壮的Java用户输入:Scanner整数解析与异常捕获

    本文深入探讨了Java Scanner在获取整数输入时,当用户输入非整数数据可能引发的InputMismatchException。我们将解释此异常的产生机制,并提供一种健壮的解决方案:通过结合try-catch语句有效捕获并处理该异常,从而避免程序崩溃,提升用户交互的稳定性与友好性。 1. Jav…

    2026年9月26日 • 用户投稿
    000
  • 利好!TikTokShop欧洲市场入驻标准更新

    利好!TikTokShop欧洲市场入驻标准更新利好!TikTokShop欧洲市场入驻标准更新利好!TikTokShop欧洲市场入驻标准更新利好!TikTokShop欧洲市场入驻标准更新

    近日,tiktokshop跨境电商针对欧洲市场释放利好信号!英国、西班牙、德国、意大利、法国欧洲五国跨境自运营(pop)模式,入驻标准更新及商家扶持新政策迎来官宣。 最新招商政策中,新商的调整核心在于,商家的第三方电商平台运营经验由【必填】调整为【选填】。同时,TikTokShop美区重点商家、有亚…

    2026年9月26日 • 用户投稿
    000
  • 怎么让豆包AI生成Python数据可视化代码

    怎么让豆包AI生成Python数据可视化代码怎么让豆包AI生成Python数据可视化代码怎么让豆包AI生成Python数据可视化代码怎么让豆包AI生成Python数据可视化代码

    明确需求、指定图表类型和库、提供数据结构或示例,能高效让豆包ai生成python可视化代码。1. 先说明要画什么图,如“柱状图”;2. 指定用哪个库,如matplotlib或seaborn;3. 提供数据结构或部分数据;4. 检查生成代码是否完整,必要时补充导入语句或显示命令。 ☞☞☞AI 智能聊天…

    2026年9月26日 • 用户投稿
    000
  • 京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制

    京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制京东新卡支付安全吗?信用卡支付安全吗?全面解析支付安全机制

    “网购时绑定新银行卡会不会被盗刷?””信用卡在平台消费是否存在风险?”随着京东等电商平台支付场景的不断拓展,用户对支付安全的关注度持续攀升。本文深入剖析京东新卡支付与信用卡支付的安全机制,用技术逻辑和平台规则消除你的顾虑。 一、京东新卡支付安全机制解析 1. 什么是京东新卡支付? 当用户首次在京东使…

    2026年9月26日 • 用户投稿
    000
  • Tomcat日志中常见的性能瓶颈是什么

    在tomcat日志中,常见的性能瓶颈主要包括以下几个方面: 线程数配置不当: 问题描述:Tomcat的线程数配置不合理可能导致请求堆积或线程资源浪费。如果线程数过少,可能无法处理高并发请求,导致请求延迟增加。相反,线程数过多可能导致频繁的上下文切换和资源竞争,影响性能。解决方法:根据服务器的硬件资源…

    2026年9月26日
    000
  • 如何在Java中使用protected修饰符

    protected成员可在同类、同包及其他包的子类中访问,主要用于继承;子类不能通过父类实例访问其protected成员,只能继承访问。 在Java中,protected 是一种访问修饰符,用于控制类成员(字段、方法、构造器或内部类)的可见性。它比 private 更宽松,但比 public 更严格…

    2026年9月26日
    100
  • 雷神 911 主机如何测试 M.2 接口?带宽性能评估​

    雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​雷神 911 主机如何测试 M.2 接口?带宽性能评估​

    要测试雷神 911 主机 m.2 接口的带宽性能,首先确认其支持的协议(pcie 或 sata)及规格,可查阅主板说明书或使用硬件检测工具;准备 m.2 ssd、最新驱动、windows 10/11 系统及测试软件如 crystaldiskmark 和 as ssd benchmark;运行测试并记…

    2026年9月26日 • 用户投稿
    000
  • 如何在Java方法中正确传递和使用数组参数

    如何在Java方法中正确传递和使用数组参数如何在Java方法中正确传递和使用数组参数如何在Java方法中正确传递和使用数组参数如何在Java方法中正确传递和使用数组参数

    本文旨在帮助Java初学者理解如何在方法中正确传递和使用数组作为参数。通过一个实际的代码示例,详细讲解了如何创建、传递和访问数组,以及如何在方法内部对数组进行操作,最终返回期望的结果。掌握这些技巧对于编写高效且功能完善的Java程序至关重要。 在Java编程中,方法经常需要接收数组作为参数,以便对一…

    2026年9月26日 • 用户投稿
    500
  • 货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解

    货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解货拉拉司机版如何使用AI推荐最佳订单_货拉拉司机版AI推荐的智能匹配详解

    货拉拉司机版通过AI智能匹配系统,基于位置、车辆类型、货运需求与历史行为等数据筛选高匹配订单,并结合AR识货、智能导航与安全预警功能,提升接单效率与运输安全。 如果您在货拉拉司机版中希望获得更高效的接单体验,但不清楚如何利用系统内的AI功能来获取最适合的订单,则可能是由于尚未了解智能匹配机制的运作方…

    2026年9月26日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信