1.1:图的定义和术语


  图是一种比线性表和树更为复杂的数据结构。在线性表中,数据元素之间仅有线性关系,每个元素仅有一个直接前驱和一个直接后继;在树形结构中,数据元素之间有着明显的层次关系,并且每一层上的数据元素可能和下一层中的多个元素,相关,但只能和上一层的一个元素相关,而在图形结构中,结点之间的关系可以是任意的,图中任意的两个元素之间都可能相关。

图是一种数据结构,再加上一组基本操作。

图的基本操作有

创建图(creatGraph),销毁图(destoryGraph),查找(searchNde),遍历(Traverse),添加结点(addNode)删除结点(deleteNode),图的遍历有深度优先遍历(DFSTraverse)和广度优先遍历(BFTraverse)

1.2图的存储结构

任何数据结构都能有两类不同的存储结构它们是不同的映像方式,(顺序映像和链式映像)因为图比较复杂,没有顺序映像的存储结构但可以借助数组的数据类型表示元素之间的关系,图常用的存储结构有邻接表,邻接多重表和十字链表。

邻接表是利用一个二维数组来表示图各元素之间的关系,具体定义如下所述,对于无向图当两个顶点(i,j)之间有边时可以将相应的aij置为1或者是 这点边的权值,而相反就将aij置为0或者是无穷大。这样一来我们就能用一个二维数据来表示图各元素之间的关系了。

下面给出图邻接矩阵的java实现代码

package neuq.chao;
import java.util.Scanner;
class GraphMatrix{
static final int MaxNum = 20;
static final int MaxValue = 65535;
char[] Vertex = new char[MaxNum]; //存储结点的信息
int GType; //图的类型0为无向图1表示有向图
int VertexNum; //结点的个数
int EdgeNum; //边的个数
int[][]EdgeWeight = new int[MaxNum+1][MaxNum+1];
int [] isTrav= new int[MaxNum];
}
public class Graph {
static Scanner input = new Scanner(System.in);
static void CreatGraph(GraphMatrix GM){
int i,j,k;
int weight;
char EstartV,EendV; System.out.printf("输入图的各顶点信息");
for(i=0;i<GM.VertexNum;i++){
System.out.printf("第%d个顶点:",i+1);
GM.Vertex[i] = (input.next().toCharArray())[0];
}
System.out.printf("输入各边的顶点及权值:\n");
for(k=0;k<GM.EdgeNum;k++){
System.out.printf("第%d条边:",k+1);
EstartV = input.next().charAt(0);
EendV = input.next().charAt(0);
weight = input.nextInt();
for(i=0;EstartV!=GM.Vertex[i];i++);
for(j=0;EendV!=GM.Vertex[j];j++);
GM.EdgeWeight[i][j] = weight;
if(GM.GType==0){ //无向图
GM.EdgeWeight[j][i]=weight;
} }
}
static void ClearGraph(GraphMatrix GM){
//清空图
int i,j;
for(i=0;i<GM.VertexNum;i++){
for(j=0;j<GM.VertexNum;j++){
GM.EdgeWeight[i][j]=GraphMatrix.MaxValue; }
}
System.out.println(GM.VertexNum);
}
static void OutGraph(GraphMatrix GM){
int i,j;
for(j=0;j<GM.VertexNum;j++){
System.out.printf("\t%c",GM.Vertex[j]);
}
System.out.printf("\n");
for(i=0;i<GM.VertexNum;i++){
System.out.printf("%c",GM.Vertex[i]);
for(j=0;j<GM.VertexNum;j++){
if(GM.EdgeWeight[i][j]==GraphMatrix.MaxValue){
System.out.printf("\tZ");
}
else{
System.out.printf("\t%d",GM.EdgeWeight[i][j]);
}
}
System.out.printf("\n");
}
}
static void DeepTraOne(GraphMatrix GM,int n){//从第n个结点开始,深度遍历图
int i;
GM.isTrav[n] = 1;
System.out.printf("->%c",GM.Vertex[n]);
//添加处理结点的操作
for(i=0;i<GM.VertexNum;i++){
if(GM.EdgeWeight[n][i]!=GraphMatrix.MaxValue&&GM.isTrav[n]==0){
DeepTraOne(GM,i);
}
}
}
static void DeepTraGraph(GraphMatrix GM){
//深度优先遍历
int i;
for(i=0;i<GM.VertexNum;i++){
GM.isTrav[i]=0;
}
System.out.printf("深度优先遍历结点");
for(i=0;i<GM.VertexNum;i++){
if(GM.isTrav[i]==0){
DeepTraOne(GM,i);
}
}
System.out.printf("\n");
}
public static void main(String args[]){
GraphMatrix GM=new GraphMatrix(); System.out.printf("输入生成图的类型");
GM.GType = input.nextInt();
System.out.printf("输入图的顶点数量:");
GM.VertexNum = input.nextInt();
System.out.print(GM.VertexNum);
System.out.printf("输入图的边数量:");
GM.EdgeNum=input.nextInt(); CreatGraph(GM); System.out.printf("该图的邻接矩阵的数据如下:\n");
OutGraph(GM);
DeepTraGraph(GM);
ClearGraph(GM);
}
}

数据结构之--图(Graphics)的更多相关文章

  1. python数据结构之图的实现

    python数据结构之图的实现,官方有一篇文章介绍,http://www.python.org/doc/essays/graphs.html 下面简要的介绍下: 比如有这么一张图: A -> B ...

  2. hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)

    还是畅通工程 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  3. 利用python+graphviz绘制数据结构关系图和指定目录下头文件包含关系图

    作为一名linux系统下的C语言开发,日常工作中经常遇到两个问题: 一是分析代码过程中,各种数据结构互相关联,只通过代码很难理清系统中所有结构体的整体架构,影响代码消化的效率; 二是多层头文件嵌套包含 ...

  4. python数据结构之图的实现方法

    python数据结构之图的实现方法 本文实例讲述了python数据结构之图的实现方法.分享给大家供大家参考.具体如下: 下面简要的介绍下: 比如有这么一张图:     A -> B     A ...

  5. python数据结构之图深度优先和广度优先实例详解

    本文实例讲述了python数据结构之图深度优先和广度优先用法.分享给大家供大家参考.具体如下: 首先有一个概念:回溯 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到 ...

  6. 数据结构之图 Part2 - 1

    邻接矩阵 网上很少有C# 写图的数据结构的例子,实际的项目中也从来没用过Array 这坨东西,随手写个,勿喷. namespace LH.GraphConsole { public struct Gr ...

  7. 数据结构之图 Part1

    Part 1 预计使用7天的时间来过掉图相关的数据结构.第一天主要是一天图的基本概念,熟练掌握定义是一切交流和沟通的基础. 1定义 1.1图 有穷非空顶点,外加边. G(V,E) Graph Vert ...

  8. C++数据结构之图

    图的实现是一件很麻烦的事情,很多同学可能在学数据结构时只是理解了图的基本操作和遍历原理,但并没有动手实践过.在此,我说说我的实现过程. 首先,在草稿纸上画一个图表,这里是有向图,无向图也一样,如下: ...

  9. 【js数据结构】图的深度优先搜索与广度优先搜索

    图类的构建 function Graph(v) {this.vertices = v;this.edges = 0;this.adj = []; for (var i = 0; i < this ...

随机推荐

  1. 【bzoj1731】Layout 排队布局

    1731: [Usaco2005 dec]Layout 排队布局 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 868  Solved: 495[Subm ...

  2. Codeforces Round #546 (Div. 2) A. Nastya Is Reading a Book

    链接:https://codeforces.com/contest/1136/problem/A 题意: 给n个区间,每个区间范围不超过100,n不超过100. 给一个位置k,1-(k-1)是遍历过的 ...

  3. p标签中的文本换行

    参考文章 word-break:break-all和word-wrap:break-word的区别 CSS自动换行.强制不换行.强制断行.超出显示省略号 属性介绍 white-space: 如何处理元 ...

  4. Python基础之collection

    collection-系列 cellection是作为字典.元组(列表与元组可互相转换)的扩充,在此需要导入cellection 一.计数器(counter) counter是对字典类型的补充,用户获 ...

  5. 说说SpringMVC、SpringBoot和SpringCloud三者之间的联系和区别

    这个问题是我在参加一次面试晚会活动上被问到的一个问题,看标题显然很简单就能够回答出来,但是仔细一琢磨,平时蒙头苦干的我们可能缺少关注和积累,好像并不能用较专业的术语和逻辑很顺畅的表达出来,于是我简要的 ...

  6. 单线程异步回调机制的缺陷与node的解决方案

    一.node单线程异步的缺陷: 单线程异步的优点自然不必多说,node之所以能够如此快的兴起,其单线程异步回调机制相比于传统同步执行编程语言的优势便是原因之一.然而,开发一个node程序,其缺陷也是不 ...

  7. 关于React的赋值与调用方法

    #关于React的赋值与调用方法 比如调用方法的时候我们可以这样来使用closeFrm() <div className = "infoFrm_close" onMouseO ...

  8. Django中多表的增删改查操作及聚合查询、F、Q查询

    一.创建表 创建四个表:书籍,出版社,作者,作者详细信息 四个表之间关系:书籍和作者多对多,作者和作者详细信息一对一,出版社和书籍一对多 创建一对一的关系:OneToOne("要绑定关系的表 ...

  9. hihoCoder #1070 : RMQ问题再临

    G++ 77ms 0MB 思路:这题用暴力是最快的,甚至比线段树还佳. 按全部都是查询的来算,是O(n*q). #include <bits/stdc++.h> using namespa ...

  10. COGS 2084. Asm.Def的基本算法

    ★☆   输入文件:asm_algo.in   输出文件:asm_algo.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “有句美国俗语说,如果走起来像鸭子,叫起来像 ...