一 图
1,图的描述
在计算机应用中,我们为了表示相连结点所表示的关系建立模型,并且这些结点之间连接很自然而然会让人产生一连串的的疑问:沿着这些连接能否从一个结点到另一个结点呢,
有多少个结点之间是相互连接着呢?两个结点之间哪一条是最短路径呢等等。
要描述这些问题,我们使用一种抽象的数据模型-图数据模型,应用此模型我们可以解决很多现实中的问题,比如地图中的两个城市之间线路问题,电路板中各种元器件与导线的连接问题,学生与各学校的配对问题等等
图的分类大致分为:无向图,有向图,加权图和加权有向图
图的定义:图是由一组顶点和一组能将两个顶点相连的边组成的
图的特殊形式:(1) 自环,即一条连接一个顶点和其自身的边 (2) 两条连接两个顶点的平行边
不过我们不会讨论这种特殊形式的,我们用两个顶点表示边就可以了。
图的一些术语
(1)相邻:两个顶点用一条边相连就是相邻,也叫两个顶点依附于这条边
(2)度数:所有依附于某个顶点的所有边的数量就是某个顶点的度数
(3)子图:是由所有边组成的一个子集
(4)路径:由边顺序连接的一系列顶点,简单路径就是没有重复的定点的路径
图的几种表示方法
(1)邻接矩阵,我们可以使用v乘v的布尔矩阵,顶点v和顶点w之间相连的边定义值为true 否则为false
但是这种条件不能够满足成千上万数百万的顶点需求
(2)边的数组,我们可以使用一个类Edge类,它含有两个顶点的实例变量,但是这种表示方法要实现邻接边操作时非常不方便
(3) 邻接表数组,我们可以使用一个顶点为索引的列表数组,其中每个元素都是和该顶点的相连的顶点列表
下面就是我的一用邻接表示一种方式
2,无向图的代码表示
import com.lxy.datastructure.bag.Bag; import edu.princeton.cs.introcs.In; /** * 无向图 * @author lxy * */ public class Graph { private static final String NEWLINE = System.getProperty("line.separator"); private int V;//顶点数目 private int E;//边的数目 private Bag<Integer>[] adj;//邻接表 public Graph(int V) { this.V=V; adj=(Bag<Integer>[])new Bag[V]; for(int v=0;v<V;v++) adj[v]=new Bag<Integer>(); } public Graph(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); } } /** * 添加一条边 v-w * @param v * @param w */ public void addEdge(int v, int w) { adj[v].add(w); adj[w].add(v); E++; } public int getE() { return E; } public int getV() { return V; } /** * 和v顶点相邻的所有边 * @param v * @return */ 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(); } }
package com.lxy.datastructure.bag; import java.util.Arrays; import java.util.Iterator; public class Bag<T> implements Iterable<T>{ private int N; private T[] elementData; public Bag() { elementData=(T[])new Object[16]; } public void add(T object) { if(elementData.length==N)resize(N*2); elementData[N++]=object; } public void resize(int m){ T[] newElementData=(T[]) new Object[m]; System.arraycopy(elementData,0,newElementData,0,N); this.elementData=newElementData; } @Override public Iterator<T> iterator() { return Arrays.asList(elementData).subList(0,N).iterator(); } public boolean isEmpty(){ return size()==0; } public int size(){ return N; } }
public class GraphTest { String basePath=System.getProperty("user.dir"); File file1=null; File file2=null; Graph g1 =null; @Before public void setup(){ file1=new File(basePath,"data/graph/mediumG.txt"); file2=new File(basePath,"data/graph/tinyG.txt"); In in = new In(file2); g1=new Graph(in); } @Test public void testPrintGraph(){ System.out.println(g1.toString()); } }
相关推荐
数据结构---C语言描述-(耿国华)-高等教育出版社出版-课后习题答案 数据结构是计算机科学中一个基础课题,涉及到数据的存储、操作和管理。数据结构可以分为线性结构、树形结构、图状结构等多种类型,每种结构都有其...
数据结构--C语言描述-(耿国华)课后习题答案 该资源是数据结构的课后习题答案,涵盖了数据结构的基本概念、线性表、栈、队列、树、图等数据结构的实现和操作。下面是该资源的详细知识点: 一、基本概念 * 数据抽象...
"数据结构---C语言描述-(耿国华)-高等教育出版社出版-课后习题答案.pdf" 本资源摘要信息是关于数据结构的课后习题答案,涵盖了数据结构的基本概念、数据抽象、信息隐蔽、数据对象、对象间的关系、一组处理数据的...
总之,《数据结构(Java描述)》一书涵盖了数据结构的基础理论和Java实现,对于理解算法和提升编程能力有着重要的作用。通过学习,读者不仅能掌握各种数据结构的特性,还能学会如何在实际问题中选择合适的数据结构和...
### 数据结构-C语言描述知识点详解 #### 知识点一:数据结构类型及特性 - **线性结构**:如数组、链表等,其中数据元素之间存在一对一的关系。线性结构的特点在于逻辑上相邻的元素在物理存储上也紧邻,便于随机...
本资源摘要信息还包括了数据结构课后习题的答案,涵盖了链表、栈、队列、树、图等多种数据结构的知识点。 本资源摘要信息总结了数据结构的基础知识点,涵盖了数据结构的定义、特点、类型、存储结构、操作、算法和...
在C语言中描述数据结构,可以充分利用C语言的低级特性和灵活性,从而实现高效的数据处理。《数据结构-用C语言描述答案》由唐善策、李龙澎和黄刘生主编,是一本针对这一主题的优秀教材,提供了完整的答案,对于学习者...
数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和管理数据,以便于进行各种操作。湖南大学的数据结构期末试题涵盖了这门课程的重要概念和技术,旨在检验学生对这些知识的理解和应用能力。以下...
唐应策版的《数据结构-用C语言描述》很可能是一个深入讲解如何使用C语言实现各种数据结构的教程或教材。 在这个PPT课件中,我们可以期待涵盖以下几个关键的数据结构知识点: 1. **数组**:最基础的数据结构,它是...
在C语言中描述数据结构,通常涉及到数组、指针、结构体等基本元素,以及栈、队列、链表、树、图等各种复杂数据结构的实现。 第一章的习题涉及了数据结构的基础概念。例如,(3)中的“象间的关系、一组数据对象、对...
《数据结构--用C语言描述》是一本专为学习C语言和数据结构的初学者编写的教材,由耿国华主编。数据结构是计算机科学中的基础学科,它研究如何有效地组织和存储数据,以便在计算上进行高效的操作。C语言是一种强大的...
严蔚敏教授编写的《数据结构--C语言描述》是一本经典教材,广泛应用于高校计算机专业教学。本书以C语言为工具,深入浅出地介绍了各种数据结构的基本概念、实现方法以及算法分析。 首先,我们来看看链表。链表是一种...
在数据结构的学习中,首先,我们从《DSB第01章.ppt》开始,它通常会介绍数据结构的基础概念,如数据、数据元素、数据对象、数据结构的定义以及分类,包括线性结构、树形结构、图结构和文件等。同时,会讲解抽象数据...