(一)概念
当需要接触多对多的概念时,会使用图。图有各种形状和大小,各条边有权重。如下是一个图:
图的边可以有方向,可以是单向和双向的
如果每个顶点代表一个任务,那么可以运用深度搜索算法来确定任务的最优执行顺序。
(二)图的表示形式
二维数组或链表都可以表示。用邻接列表表示,可以每个顶点和其边存入一个一维数组,再将所有顶点的合成二维数组。但是这样如果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();
}