Java实现基于邻接表的图的几个应用

本文介绍了一种使用Java实现基于邻接表的图,并通过具体示例展示了如何构造图、打印图、进行深度和广度优先搜索等基本操作。此外还提供了测试案例,验证了图的连通性和路径查找功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java实现基于邻接表的图的几个应用

图建立类:

package graph1;

import java.util.LinkedList;

import graph.Graph.edgeNode;

public class Graph {

	class EdgeNode{
			int adjvex;
			EdgeNode nextEdge;
	}
	
	class VexNode{
		int data;
		EdgeNode firstEdge;
		boolean isVisted;
		public boolean isVisted() {
			return isVisted;
		}
		public void setVisted(boolean isVisted) {
			this.isVisted = isVisted;
		}
		
	}

	VexNode[] vexsarray ;
	int[] visited = new int[100];
	boolean[] isVisited = new boolean[100];
	
	public void linkLast(EdgeNode target,EdgeNode node) {
		while (target.nextEdge!=null) {
			target=target.nextEdge;
		}
		target.nextEdge=node;
	}
	
	public int getPosition(int data) {
			for(int i=0;i<vexsarray.length;i++) {
				if (data==vexsarray[i].data) {
						return i;
				}
			}
				return -1;
	}
	
	
	public void buildGraph(int[] vexs,int[][] edges ) {
		int vLen = vexs.length;
		int eLen = edges.length;
		vexsarray = new VexNode[vLen];
		
		for(int i=0;i<vLen;i++) {
			vexsarray[i] = new VexNode();
			vexsarray[i].data = vexs[i];
			vexsarray[i].firstEdge = null;
		}
		
		for(int i=0;i<eLen;i++) {
			
			int a = edges[i][0];
			int b = edges[i][1];
			
			int start = getPosition(a);
			int end = getPosition(b);
			
			EdgeNode edgeNode = new EdgeNode();
			edgeNode.adjvex = end;
			
			if (vexsarray[start].firstEdge == null) {
				vexsarray[start].firstEdge = edgeNode;
			} else {
				linkLast(vexsarray[start].firstEdge,edgeNode);
			}
		}
	}
	
	
	public void printGraph() {
		for(int i=0;i<vexsarray.length;i++) {
			System.out.printf("%d--",vexsarray[i].data);
			EdgeNode node = vexsarray[i].firstEdge;
			while (node!=null) {
				System.out.printf("%d(%d)--",node.adjvex,vexsarray[node.adjvex].data);
				node = node.nextEdge;
			}
			System.out.println("\n");
		}
	}
	
	/*
	 * 深度遍历
	 */
	
	public void DFS(int vex) {
		
			int w;
			EdgeNode node;
			visited[vex] = 1;
//			System.out.println(vex);
			node=vexsarray[getPosition(vex)].firstEdge;
			while (node!=null) {
				w=node.adjvex;
				if (visited[vexsarray[w].data]==0) {
					DFS(vexsarray[w].data);
				}
				node=node.nextEdge;
			}
	}
	
	/*
	 * 广度遍历
	 */
	public void BFS(int vex) {
		VexNode start = vexsarray[getPosition(vex)];
		LinkedList<VexNode> queue = new  LinkedList<>();
		start.setVisted(true);
		queue.add(start);
		System.out.println(start.data);
		VexNode currVex;
		while (!queue.isEmpty()) {
			currVex=queue.remove(0);
			EdgeNode node = currVex.firstEdge;
			while (node!=null) {
				if (vexsarray[node.adjvex].isVisted==false) {
					System.out.println(vexsarray[node.adjvex].data);
					vexsarray[node.adjvex].setVisted(true);
					queue.add(vexsarray[node.adjvex]);
				}
				node=node.nextEdge;
			}
		}
		
		
		
	}
	
}

应用类:

package graph1;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Stack;

import graph.DFS;
import graph.Graph.vexNode;
import graph1.Graph.EdgeNode;
import graph1.Graph.VexNode;

public class Graph_App {
	int[] index = new int[20];
	LinkedList<VexNode> path = new LinkedList<>();
	LinkedList<VexNode> path2 = new LinkedList<>();
	boolean[] vis = new boolean[15];
//	int d = -1;
	/*
	 * 判断是否为连通图
	 */
	public boolean connect(Graph graph) {
		boolean flag=true;
		graph.DFS(0);
		for(int i=0;i<graph.vexsarray.length;i++) {
			if (!graph.vexsarray[i].isVisted) {
						flag=flag;
						break;
			}
		}
		return flag;
	}
	
	/*
	 * 判断顶点v1到v2之间是否有路径
	 */
	public boolean HasaPath(Graph graph,VexNode vexNode1,VexNode vexNode2) {
				EdgeNode node = vexNode1.firstEdge;
				int i=0;
				boolean flag=false;
				while (node!=null) {
					
					index[i] = graph.vexsarray[node.adjvex].data;
					i++;
					node=node.nextEdge;
				}
				
				for(int j=0;j<index.length;j++) {
					if (index[j]==vexNode2.data) {
						flag=true;
					}
					
				}
				return flag;
	}
	
	
	/*
	 * 找到顶点v1到v2之间的路径
	 */
	public void FindPath(Graph graph,VexNode vexNode1,VexNode vexNode2) {
			EdgeNode node = vexNode1.firstEdge;
			int w;
			VexNode vexNode ;
			vexNode1.setVisted(true);
			path.add(vexNode1);
			while (node!=null) {
				w=node.adjvex;
				if (!graph.vexsarray[w].isVisted) {
				
					FindPath(graph, graph.vexsarray[w], vexNode2);
				}
				node=node.nextEdge;
			}
		
		
	}
	
	

	
}

测试类:

package graph1;

import java.util.Iterator;

import graph1.Graph.VexNode;

public class Tset2 {

	public static void main(String[] args) {

		int[] vexs = {0,1,2,3,4};
		int[][] edges = {
				{0,1},
				{0,3},
				{1,0},
				{1,2},
				{2,1},
				{2,3},
				{2,4},
				{3,0},
				{3,2},
				{3,4},
				{4,2},
				{4,3},
				
		};
		Graph graph = new Graph();
		graph.buildGraph(vexs, edges);
		graph.printGraph();
		Graph_App app = new Graph_App();
		System.out.println(app.connect(graph));
		System.out.println(app.HasaPath(graph, graph.vexsarray[0],graph.vexsarray[3]));
		app.FindPath(graph, graph.vexsarray[0],graph.vexsarray[4]);
		Iterator<VexNode> iterator = app.path.iterator();
		while (iterator.hasNext()) {
			System.out.println(iterator.next().data);
		}
		
		
	}

}
/* * 基于邻接边表实现结构 */ package dsa; public class Graph_List implements Graph { //变量 protected List E;//容器:存放中所有边 protected List V;//容器:存放中所有顶点 //构造方法 public Graph_List() { E = new List_DLNode(); V = new List_DLNode(); } //取的边表、顶点表 protected List getE() { return E; } protected List getV() { return V; } //取中顶点、边的数目 public int vNumber() { return V.getSize(); } public int eNumber() { return E.getSize(); } //取中所有顶点、顶点位置的迭代器 public Iterator vertices() { return V.elements(); } public Iterator vPositions() { return V.positions(); } //返回中所有边、边位置的迭代器 public Iterator edges() { return E.elements(); } public Iterator ePositions() { return E.positions(); } //检测是否有某条边从顶点u指向v public boolean areAdjacent(Vertex u, Vertex v) { return (null != edgeFromTo(u, v)); } //取从顶点u指向v的边,若不存在,则返回null public Edge edgeFromTo(Vertex u, Vertex v) { for (Iterator it = u.outEdges(); it.hasNext();) {//逐一检查 Edge e = (Edge)it.getNext();//以u为尾的每一条边e if (v == e.getVPosInV(1).getElem())//若e是(u, v),则 return e;//返回该边 } return null;//若不存在这样的(u, v),则返回null } //将顶点v从顶点集中删除,并返回之 public Vertex remove(Vertex v) { while (0 < v.outDeg())//将以v为尾的所有边 remove((Edge)(((Vertex_List)v).outEdges.first()).getElem());//逐一删除 while (0 < v.inDeg())//将以v为头的所有边 remove((Edge)(((Vertex_List)v).inEdges.first()).getElem());//逐一删除 return (Vertex)V.remove(v.getVPosInV());//在顶点表中删除v } //将边e从边集中删除,并返回之 public Edge remove(Edge e) { ((Vertex_List)e.getVPosInV(0).getElem()).outEdges.remove(e.getEPosInI(0));//从起点的出边表中删除e ((Vertex_List)e.getVPosInV(1).getElem()).inEdges.remove(e.getEPosInI(1));//从终点的入边表中删除e return (Edge)E.remove(e.getEPosInE());//从边表中删除e } //在顶点集V中插入新顶点v,并返回其位置 public Position insert(Vertex v) { return V.insertLast(v); } //在边集E中插入新边e,并返回其位置 public Position insert(Edge e) { return E.insertLast(e); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值