本文介绍了图的基本概念,包括有向图和邻接矩阵的表示,重点讲解了如何运用深度优先搜索算法优化任务执行顺序。通过实例演示了如何在GraPh类中实现DFS算法,并给出了一个测试案例。

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

(一)概念

当需要接触多对多的概念时,会使用图。图有各种形状和大小,各条边有权重。如下是一个图:

图的边可以有方向,可以是单向和双向的

如果每个顶点代表一个任务,那么可以运用深度搜索算法来确定任务的最优执行顺序。

(二)图的表示形式

二维数组或链表都可以表示。用邻接列表表示,可以每个顶点和其边存入一个一维数组,再将所有顶点的合成二维数组。但是这样如果A顶点到B顶点是单向的,查找它们之间的边比较费时。邻接矩阵就是行和列都是顶点,用对应行列的值来表示连接关系,如果两个点有连接,对应值就是权重,如下:

这样比较耗费空间。

(三)深度优先遍历

实现下列图:

 

在访问A的时候就会访问到AB的边,这样访问B的时候就不能再重复,深度优先遍历可以避免这个问题。

package map;

import java.util.ArrayList;

public class Gragh {
	//定义顶点元素
	private ArrayList<String> dianList;
	//定义邻接矩阵
	private int[][] matrix;
	//定义边个数以及表示是否已经选择的数组
	private int edgeNum;
	private boolean[] isSelected;
	public Gragh(int x) {
		dianList=new ArrayList<String>(x);
		matrix=new int[x][x];
		isSelected=new boolean[x];
		edgeNum=0;
	}
	//添加顶点
	public void addDian(String s) {
		dianList.add(s);
	}
	//定义各点之间边的权重,为0表示没有,为1表示有
	//x和y表示邻接矩阵中的坐标
	public void addEdge(int x,int y,int w) {
		matrix[x][y]=w;
		matrix[y][x]=w;
		//记得要反过来插入。
		edgeNum=edgeNum+1;
	}
	//查看两个点之间的权重
	public int linkState(int x,int y) {
		return matrix[x][y];
	}
	public void showMatrix() {
		int len=this.dianList.size();
		for (int i=0;i<len;i++) {
			System.out.print("[ ");
			for (int j=0;j<len;j++) {
				System.out.print(this.matrix[i][j]+" ");
			}
			System.out.println("]");
		}
	}
	//获取与某个顶点初次相连的邻接点,传入该顶点的索引
	public int firstIndex(int index) {
		int len=this.dianList.size();
		for (int i=0;i<len;i++) {
			if (this.matrix[index][i]>0) {
				return i;
			}
		}
		//没有邻接点
		return -1;
	}
	//从已经获得的相邻结点开始,查找下一个相邻结点
	public int nextIndex(int x,int y) {
		int len=this.dianList.size();
		for(int i=y+1;i<len;i++) {
			if (this.matrix[x][i]>0) {
				return i;
			}
		}
		return -1;
	}
	//深度优先遍历算法
	public void dfs(boolean[] isSelected,int i) {
		System.out.print(this.dianList.get(i));
		isSelected[i]=true;
		int w=firstIndex(i);
		while(w!=-1) {
			if(isSelected[w]) {
				//当找到的结点已经选过,即已经输出过了,找下一个结点,继续循环
				w=nextIndex(i,w);
			}else {
				//这个结点没选过,迭代后进行输出
				dfs(isSelected,w);
			}
		}
	}
	//重载
	public void dfs() {
		dfs(this.isSelected,0);
	}
}

 测试例子:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Gragh g=new Gragh(5);
		String[] dian= {"a","b","c","d","e"};
		for (String s:dian) {
			g.addDian(s);
		}
		g.addEdge(0, 1, 1);
		g.addEdge(0, 2, 1);
		g.addEdge(1, 2, 1);
		g.addEdge(1, 3, 1);
		g.addEdge(1, 4, 1);
		g.showMatrix();
		g.dfs();
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值