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);
}
}

最新文章

  1. python描述符理解
  2. NOSDK--一键打包的实现(五)
  3. ImageJ 学习第一篇
  4. Google 新推出Background sync API
  5. Eclipse tomcat先启动成功,然后再报超时原因之一
  6. C++中explicit关键字的作用
  7. Android 自定义seekbar中,thumb被覆盖掉一部分问题
  8. ios中框架介绍
  9. Mac MySQL 数据库管理(关系型数据库管理系统)
  10. LeetCode 26 Remove Duplicates from Sorted Array (移除有序数组中重复数字)
  11. 在windows里安装系统7、8、10或Offcie或Visio等推荐的激活工具
  12. Java并发工具类(一):等待多线程完成的CountDownLatch
  13. 超全面的JavaWeb笔记day21&lt;过滤器&gt;
  14. nginx gzip压缩配置
  15. Python partition() 方法
  16. 关闭IOS更新功能(ios4/5/6)
  17. cookie和session的自我介绍
  18. 第二百一十六节,jQuery EasyUI,Spinner(微调)组件
  19. (九)jsMath
  20. “Enterprise Architect”和数据库的不解之缘

热门文章

  1. [软件工程基础]2017.11.04 第八次 Scrum 会议
  2. 2017&quot;百度之星&quot;程序设计大赛 - 初赛(A)今夕何夕
  3. pycharm 虚拟环境virtualenv迁移到别的机器 无法读取包的问题
  4. 102 Binary Tree Level Order Traversal 二叉树的层次遍历
  5. jQuery插件pagination.js源码解读
  6. javaScript面向对像
  7. go实现生产者消费者
  8. Linux-软件安装(一) —— jdk/tomact 安装(普通安装)
  9. Hibernate框架关系映射一对多双向关联
  10. Objective-C Loops