【算法基础实验】图论-构建无向图

2024-04-26 19:36

本文主要是介绍【算法基础实验】图论-构建无向图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

构建无向图

前提

JAVA实验环境

理论

无向图的数据结构为邻接表数组,每个数组中保存一个Bag抽象数据类型(Bag类型需要专门讲解)
在这里插入图片描述

实验数据

我们的实验数据是13个节点和13条边组成的无向图,由一个txt文件来保存,本实验的目的就是将这个txt文件的图构建出来,并且依次打印出每个节点的所有邻接节点

实验数据下载地址: https://algs4.cs.princeton.edu/code/algs4-data.zip

在这里插入图片描述

完整代码

import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;public class myGraph
{private final int V;private int E;private myBag<Integer>[] adj;private static final String NEWLINE = System.getProperty("line.separator");public myGraph(int V){this.V = V; this.E = 0;adj = (myBag<Integer>[]) new myBag[V];for (int v = 0; v < V; v++){adj[v] = new myBag<Integer>();}}public myGraph(In in){this(in.readInt());int E = in.readInt();for (int i = 0; i < E; i++){int v = in.readInt();int w = in.readInt();addEdge(v, w);}}public int V() { return V; }public int E() { return E; }public void addEdge(int v, int w){adj[v].add(w);adj[w].add(v);E++;}public Iterable<Integer> adj(int v){ return adj[v]; }public String toString() {StringBuilder s = new StringBuilder();s.append(V + " vertices, " + E + " edges " + NEWLINE);for (int v = 0; v < V; v++) {s.append(v + ": ");for (int w : adj[v]) {s.append(w + " ");}s.append(NEWLINE);}return s.toString();}public static void main(String[] args) {In in = new In(args[0]);myGraph G = new myGraph(in);StdOut.println(G);}
}

代码解读

这段代码是一个用Java编写的图(Graph)数据结构的实现。下面是对这段代码的逐行解读,可以帮助你向其他人详细介绍这个程序:

类定义

public class myGraph

这行定义了一个名为 myGraph 的类,用于表示一个无向图。

成员变量

private final int V;   // 图的顶点数
private int E;         // 图的边数
private myBag<Integer>[] adj; // 邻接表数组
private static final String NEWLINE = System.getProperty("line.separator"); // 系统换行符
  • V 是图的顶点数,定义为 final 因为一旦图被创建顶点数是不变的。
  • E 是图的边数。
  • adj 是一个数组,每个索引处的元素是一个 myBag<Integer> 类型,用来存储与每个顶点相邻的顶点列表,实现邻接表。
  • NEWLINE 是系统相关的换行符,用于输出。

构造方法

public myGraph(int V

这是一个构造方法,接受一个整数 V 作为参数,初始化一个有 V 个顶点但没有边的图。

this.V = V; this.E = 0;
adj = (myBag<Integer>[]) new myBag[V];
for (int v = 0; v < V; v++) {adj[v] = new myBag<Integer>();
}
  • 初始化顶点数 V 和边数 E
  • 创建邻接表数组,每个顶点对应一个新的空 myBag 对象。

从输入流构造图

public myGraph(In in)

这个构造方法从输入流 in 构建图。首先读取顶点数和边数,然后读取每一条边的两个顶点,并调用 addEdge 方法添加边。

this(in.readInt()); // 初始化图的顶点
int E = in.readInt(); // 读取边数
for (int i = 0; i < E; i++) {int v = in.readInt(); // 读取一条边的起点int w = in.readInt(); // 读取一条边的终点addEdge(v, w); // 添加边
}

方法定义

public int V() { return V; }
public int E() { return E; }

这两个方法分别返回图的顶点数和边数。

public void addEdge(int v, int w)

此方法用于添加一条连接顶点 vw 的边,并更新邻接表和边数。

adj[v].add(w);
adj[w].add(v);
E++;
  • 在顶点 vw 的邻接表中互相添加对方。
  • 边数 E 自增。
public Iterable<Integer> adj(int v)
{ return adj[v]; }

这个方法返回顶点 v 的邻接顶点列表。

toString 方法

public String toString() {StringBuilder s = new StringBuilder();s.append(V + " vertices, " + E + " edges " + NEWLINE);for (int v = 0; v < V; v++) {s.append(v + ": ");for (int w : adj[v]) {s.append(w + " ");}s.append(NEWLINE);}return s.toString();
}

这个方法返回图的字符串表示形式,包含所有顶点和它们的邻接顶点。

main 方法

public static void main(String[] args) {In in = new In(args[0]);myGraph G = new myGraph(in);StdOut.println(G);
}

main 方法从文件读取图数据,创建 myGraph 实例,并打印图的内容。

这段代码完整地展示了如何在Java中实现一个简单的无向图数据结构,并提供了读取图数据

实验

java myGraph data\tinyG.txt
13 vertices, 13 edges 
0: 6 2 1 5 
1: 0 
2: 0 
3: 5 4 
4: 5 6 3 
5: 3 4 0 
6: 0 4 
7: 8
8: 7
9: 11 10 12
10: 9
11: 9 12
12: 11 9

参考资料

算法(第4版)人民邮电出版社

这篇关于【算法基础实验】图论-构建无向图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/938472

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费