`
javawangzilong
  • 浏览: 57098 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

java图的邻接矩阵的表示和实现

阅读更多
邻接矩阵表示的带权图。。。
首先创建了一个带权值的边类,在图中插入图的权值,所谓权值就是边上的数字,可以表示两个顶点之间的边的含义(可以是距离,路费。。。)
public class Edge implements Comparable<Edge> {

	public int start,dest,weight;
	
	public Edge(int start,int dest,int weight){
		this.start = start;
		this.dest = dest;
		this.weight = weight;
	}
	
	public String toString(){
		return "("+start+","+dest+","+weight+")";
	}
	public int compareTo(Edge e) {
		// TODO Auto-generated method stub
		if(this.start!=e.start)
			return this.start - e.start;
		return this.dest - e.dest;
	}

}


其次创建邻接矩阵带权图类,在此类中用到的SeqList<T>是我前几天所写的一个顺序表类,主要是用来存放顶点集合的,可以自己定义也可以用jdk中给的顺序表

public class AdjMatrixGraph<T> {
	protected SeqList<T> vertexlist;			//顺序表存储的顶底集合
	protected int[][] adjmatrix;				//图的邻接矩阵,用二维数组表示
	private final int MAX_WEIGHT = 99999;		//设置最大权值,设置成常量
	public AdjMatrixGraph(int size){
		size = size<10?10:size;
		this.vertexlist = new SeqList<T>(size); //构造容量为size的空顺序表
		this.adjmatrix = new int[size][size];   
		
		for(int i=0;i<size;i++){				//初始化邻接矩阵
			for(int j=0;j<size;j++){
				this.adjmatrix[i][j] = (i==j)?0:MAX_WEIGHT;
			}
		}
	}
		
		public AdjMatrixGraph(T[] vertices,Edge[] edges){
			this(vertices.length);
			if(vertices == null)
				return;
			for(int i=0;i<vertices.length;i++)
				insertVertex(vertices[i]);
			if(edges!=null)
					for(int j=0;j<edges.length;j++)
						insertEdge(edges[j]);
		}
	
		public int vertexCount(){return this.vertexlist.length();}		//返回定点顺序表的元素个数
		
		public T get(int i){return this.vertexlist.get(i);}			 	//返回第i个定点的元素
		
		public int getWeight(int i,int j){return this.adjmatrix[i][j];}	//返<vi,vj>边的权值
		
		public String toString(){
			String str = "顶点集合:"+this.vertexlist.toString()+"\n邻接矩阵:\n";
			int n = this.vertexCount();
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++)
					str += this.adjmatrix[i][j] == MAX_WEIGHT?" $":" "+this.adjmatrix[i][j];
				str +="\n";
			}
			return str;
		}
		
		public int insertVertex(T x){
			this.vertexlist.append(x);				//顺序表追加元素,自动扩充
			if(this.vertexCount()>this.adjmatrix.length){		//若二维数组不足,则扩充
				int temp[][] = adjmatrix,i,j;					//定义了局部变量i,j;
				this.adjmatrix = new int[temp.length*2][temp.length*2];		//二维数组扩充2倍
				for(i=0;i<temp.length;i++){
					for(j=0;j<temp.length;j++)
						this.adjmatrix[i][j] = temp[i][j];
					for(j=temp.length;j<temp.length*2;j++)
						this.adjmatrix[i][j] = MAX_WEIGHT;
				}
				for(i=temp.length;i<temp.length*2;i++)
					for(j=0;j<temp.length*2;j++)
						this.adjmatrix[i][j] = (i == j)?0:MAX_WEIGHT;
			}
			return this.vertexlist.length()-1;					//返回插入顶点的序号			
		}
		
		public void  insertEdge(int i,int j,int weight){       //插入一条边
			int n = this.vertexCount();
			if(i>=0&&i<n&&j>=0&&j<n&&this.adjmatrix[i][j]==MAX_WEIGHT&&i!=j)
				this.adjmatrix[i][j] = weight;
		}
		
		public void insertEdge(Edge edge){
			this.insertEdge(edge.start, edge.dest, edge.weight);
		}
			
		public void removeEdge(int i,int j){					//删除一条边
			if(i>=0&&i<vertexCount()&&j>=0&&j<vertexCount()&&i!=j)
				this.adjmatrix[i][j] = MAX_WEIGHT;
		}
		
		public void removeVertex(int i){						//删除顶点以及和顶点有关系的边
			int n = this.vertexCount();
			if(i<0||i>n)
				return;
			this.vertexlist.remove(i);
			for(int j=0;j<i;j++)
				for(int k=i+1;k<n;k++)
					this.adjmatrix[j][k-1] = this.adjmatrix[j][k];		//元素向左移一行
			for(int j=i+1;j<n;j++)
				for(int k=0;k<i;k++)
					this.adjmatrix[j-1][k] = this.adjmatrix[j][k];		//元素向上移一行
			
			for(int j=i+1;j<n;j++)
				for(int k=i+1;k<n;k++)
					this.adjmatrix[j-1][k-1] = this.adjmatrix[j][k];
		}
		
		public static void main(String[] args){
			String[] verices = {"A","B","C","D","E"};
			Edge edges[] = {new Edge(0,1,5),new Edge(0,3,2),new Edge(1,0,5),
							new Edge(1,2,7),new Edge(1,3,6),new Edge(2,1,7),
							new Edge(2,3,8),new Edge(2,4,3),new Edge(3,0,2),
							new Edge(3,1,6),new Edge(3,2,8),new Edge(3,4,9),
							new Edge(4,2,3),new Edge(4,3,9)};
			AdjMatrixGraph<String> graph = new AdjMatrixGraph<String>(verices,edges);
			System.out.println("带权无向图"+graph.toString());
			System.out.println("插入顶点F,插入边(A,F,9),删除顶点C,删除边(D,E)");
			int i = graph.insertVertex("F");
			graph.insertEdge(0,i,9);
			graph.insertEdge(i,0,9);
			graph.removeVertex(2);
			graph.removeEdge(2, 3);
			graph.removeEdge(3, 2);
			System.out.println(graph.toString());
		}
}



输出结果如下(其中"$"表示最大权值)
带权无向图顶点集合:A B C D E 
邻接矩阵:
 0 5 $ 2 $
 5 0 7 6 $
 $ 7 0 8 3
 2 6 8 0 9
 $ $ 3 9 0

插入顶点F,插入边(A,F,9),删除顶点C,删除边(D,E)
顶点集合:A B D E F 
邻接矩阵:
 0 5 2 $ 9
 5 0 6 $ $
 2 6 0 $ $
 $ $ $ 0 $
 9 $ $ $ 0
分享到:
评论

相关推荐

    图的邻接矩阵实现及广度优先搜索(JAVA)

    在Java中,我们可以通过多种方式来表示图,其中一种常见的方法就是使用邻接矩阵。本文将深入探讨如何使用Java实现图的邻接矩阵以及如何在该数据结构上执行广度优先搜索(BFS)。 **邻接矩阵** 邻接矩阵是一种二维...

    图的邻接矩阵

    9. 图的邻接矩阵的实现:图的邻接矩阵可以使用C语言、Java语言、Python语言等多种编程语言来实现。 10. 图的邻接矩阵的常见错误:图的邻接矩阵的实现中,常见的错误包括矩阵越界、边的权值错误等。

    图的邻接矩阵实现及深度优先搜索(JAVA)

    在这个话题中,我们将深入探讨如何使用Java语言实现图的邻接矩阵表示法以及如何进行深度优先搜索(DFS)。 首先,邻接矩阵是一种二维数组,用于存储图中节点之间的连接信息。如果节点i和节点j之间存在边,那么邻接...

    邻接矩阵实现图的广搜和深搜(java模板)

    本文将深入探讨如何使用邻接矩阵来实现图的广度优先搜索(BFS)和深度优先搜索(DFS),并提供一个Java模板。 首先,我们需要理解邻接矩阵的概念。邻接矩阵是一个二维数组,其中的元素表示图中节点之间的连接。如果...

    邻接矩阵和邻接表存储的图的遍历

    本主题将深入探讨两种常见的图存储方式——邻接矩阵和邻接表,以及如何在这两种存储方式下实现深度优先遍历(DFS)和广度优先遍历(BFS)。 首先,邻接矩阵是一种直观的图表示方法,它使用二维数组来存储图中每个...

    图的邻接矩阵表示实验

    1)实现图的邻接矩阵和邻接表存储结构; 2)完成基于邻接矩阵的深度优先搜索遍历及广度优先搜索遍历; 3)实现从键盘输入任意一对顶点,求出顶点间的最短路径。

    图的邻接矩阵实现

    图的邻接矩阵实现,用邻接矩阵实现了图,基本操作,主要算法

    数据结构邻接矩阵 Graph

    数据结构邻接矩阵是图论中的一个重要概念,用于...通过研究"数据结构邻接矩阵 Graph"的源代码,我们可以深入了解邻接矩阵的实现细节,进一步掌握图论和数据结构的相关知识,这对于理解和解决涉及图的算法问题至关重要。

    有向图的邻接矩阵.。。

    在实际编程中,我们可以使用Python、Java等语言创建邻接矩阵,并实现相关的图操作,如添加、删除边,查找路径,计算最短路径等。例如,在Python中,可以使用NumPy库创建和操作邻接矩阵。 总之,有向图的邻接矩阵是...

    数据结构 图(邻接矩阵) java图形界面 实现

    6. **GraphGui.java**:这是项目中的主要源代码文件,很可能包含了图的类定义,邻接矩阵的实现,以及GUI组件的布局和事件监听。文件可能包括以下功能: - 初始化图和邻接矩阵 - 添加和删除顶点 - 显示和更新GUI以...

    实战应用Java算法分析与设计-3图的概念以及图的邻接矩阵类实现

    通过本课程的学习,学员可以掌握以下技术点:线性结构与顺序表、单向链表、循环链表、栈的基本概念、链式堆栈、中缀表达式、队列、链式队列、串、MyString、Brute-Force算法、MySet类实现、矩阵类、递归算法、哈夫曼...

    邻接矩阵存储图的深度优先遍历

    邻接矩阵是一种常用的图存储方式,其本质是一个二维数组。对于有 � n 个节点的无向图,我们可以用一个 � × � n×n 的二维矩阵 � G 来表示它,其中 � � , � G i,j ​ 表示节点 � i 与节点 � j 之间...

    Java编程实现邻接矩阵表示稠密图代码示例

    本文主要介绍了Java编程实现邻接矩阵表示稠密图代码示例,通过对邻接矩阵模型类的实现,提供了插入结点、插入边、取得某一结点的第一个邻接结点和下一个邻接结点等功能。 一、邻接矩阵模型类 邻接矩阵模型类的类名...

    JAVA实现求矩阵表示的无向图的欧拉通路、回路及欧拉图判定

    在Java中实现这一功能,我们可以使用邻接矩阵来表示无向图。邻接矩阵是一个二维数组,其中的元素表示对应节点之间是否存在边。若存在边,元素值为1,否则为0。以下是一些关键步骤: 1. **读取矩阵**:首先,我们...

    图的邻接表存储及遍历(JAVA)

    相比于邻接矩阵,邻接表在处理稀疏图(边的数量远小于顶点数量的平方)时更节省空间。邻接表的主要优点是它可以根据边的连接关系动态地添加和删除,且遍历效率较高。 二、邻接表的实现 在Java中,我们可以使用...

    邻接矩阵表示的带权有向图网演示程序.doc

    总的来说,这个程序提供了一个用Java实现的邻接矩阵表示的带权有向图的框架,允许用户动态地构建、修改和查看图的结构。通过插入顶点和边的函数,用户可以创建复杂的数据结构,并通过邻接矩阵直观地理解图的连接关系...

    基于java数据结构实验基于邻接矩阵和邻接表的深度广度优先遍历图.pdf

    基于Java数据结构实验基于邻接矩阵和邻接表的深度广度优先遍历图 ...实验报告的主要贡献是基于Java数据结构实验,实验名称为“基于邻接矩阵和邻接表的深度广度优先遍历图”,实验的结果表明实验的成功实现。

    生成空间邻接矩阵 Jgal2WM(jar包)

    根据Geoda生成的gal文件手工形成邻接矩阵太麻烦,也容易产生误差、 用java写了个gal2WM的小程序,顾名思义,就是将Geoda gal文件转成Matlab能够处理的格式。 使用方法: 1、运行jar包 2、打开gal文件(gal文件参见...

    如何用java实现图的存储【邻接矩阵】

    如何用java实现图的存储【邻接矩阵】首先得考虑图的几条重要特性如何表示顶点如何表示边表示图中的边有两种方法,邻接矩阵和邻接表。如何构造邻接矩阵如何把图打印出来看看结果附上代码完结撒花 首先得考虑图的几条...

Global site tag (gtag.js) - Google Analytics