使用邻接表来表示图

1.  图的表示有几种方法:

一是使用邻接矩阵(其实就是二维数组)表示,二是使用邻接表来表示 ,三是使用边集来表示

下面使用邻接表来表示

2. 首先定义一个图的节点,其中包含几个属性,包含图节点的值,邻居节点,当前节点是否被访问的标志,还有就是对于属性相应的的操作,包括增加邻居节点,获取邻居节点,获取当前节点的邻居节点的个数

import java.util.ArrayList;
import java.util.List;
//邻接表的表示使用ArrayList来表示邻居
public class GraphNode_AL {
	public int val;
	//邻居节点
	private List<GraphNode_AL> neighbors;
	//当前的节点是否被访问
	public boolean checked = false;
	//构造方法
	public GraphNode_AL(int val) {
		this.val = val;
	}
	
	//增加邻居节点
	public void add(GraphNode_AL node){
		if(this.neighbors == null)
			neighbors = new ArrayList<GraphNode_AL>();
		//不为空的时候加入当前的邻居
		this.neighbors.add(node);	
	}
	
	public GraphNode_AL getNeighbor(int i){
		return this.neighbors.get(i);
				
	}
	
	//获取当前节点邻居的个数
	public int size(){
		return this.neighbors.size();
	}
}

 

3. 新建图的节点,使用图的节点根据与邻居之间的关系构建一个图,在main方法中使用深搜的方法来遍历图的节点,使用之前定义的图节点中当前节点是否被访问的标志来判断当前的节点是否被访问

public class Graph {
	//使用邻接表来表示图的实现
	public static void main(String[] args) {
		GraphNode_AL n1 = new GraphNode_AL(1);
		GraphNode_AL n2 = new GraphNode_AL(2);
		GraphNode_AL n3 = new GraphNode_AL(3);
		GraphNode_AL n4 = new GraphNode_AL(4);
		GraphNode_AL n5 = new GraphNode_AL(5);
		GraphNode_AL n6 = new GraphNode_AL(6);
		GraphNode_AL n7 = new GraphNode_AL(7);
		GraphNode_AL n8 = new GraphNode_AL(8);
		GraphNode_AL n9 = new GraphNode_AL(9);
		
		n1.add(n2);
		n1.add(n3);
		n1.add(n7);
		n1.add(n8);
		n1.add(n9);
		
		n2.add(n1);
		n2.add(n5);
		
		n3.add(n1);
		n3.add(n5);
		n3.add(n6);
		
		n4.add(n1);
		n4.add(n6);
		n5.add(n2);
		n5.add(n3);
		n6.add(n3);
		n6.add(n4);
		n7.add(n1);
		n8.add(n1);
		n9.add(n1);
		/*dfs(n9);
		System.out.print("\n");*/
		dfs(n1);
	}

	//深搜
	static void dfs(GraphNode_AL node) {
	    System.out.print(node.val + " ");
	    node.checked = true;
	    for (int i = 0; i < node.size(); i++) {
	      GraphNode_AL graphNode = node.getNeighbor(i);
	      if (graphNode.checked == false)
	        dfs(graphNode);
	    }
	}
}

4. 邻接表对于某些无根的树或者无向图的处理来说是比较有效的,因为是无向的所有联系的节点之间是可以进行互通的,所以使用邻接表来进行深度优先搜索是很容易找到与当前节点有关系的节点的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值