深度遍历 java_java 图论一 深度遍历和广度遍历

图对建模很有帮助。

图的基本知识:

Java实现图的两种方法

1邻接矩阵

邻接矩阵是用二维数据,使用1代表节点间有边,如下表格:

A

B

C

D

A

0

1

1

1

B

1

0

0

1

C

1

0

0

0

D

1

1

0

0

2邻接表

临界表是使用类似链表,连接节点,表示有边

定点

包含邻接顶点的链表

A

B->C->D

B

A->D

C

A

D

A->B

深度遍历思路:

使用栈,查找栈顶顶点连通到的,没有访问的顶点,使其入栈,并访问。当找不到,则当前栈顶元素出栈。否则继续查找。

广度遍历思路:

使用队列,查找队列头连通的,没有访问的顶点,使其入队列,并访问。当找不到,则当前顶点出队列。否则继续遍历当前队列顶点

他们的不同之处就在,栈访问的顶点变化,会越来越深;队列访问的顶点不变化,只有出队列后才换节点访问。

图在java中的邻接矩阵实现:

package com.Construction;

import java.util.LinkedList;

import java.util.Queue;

import java.util.Stack;

public class GraphSimpleExample {

private final int MAX_VERTS = 20;

private GraphNodeBean nodeList[];

private int adjMat[][];

private int nVerts;

public GraphSimpleExample(){

nodeList = new GraphNodeBean[MAX_VERTS];

adjMat = new int[MAX_VERTS][MAX_VERTS];

nVerts = 0;

for (int i = 0; i < MAX_VERTS; i++) {

for (int j = 0; j < MAX_VERTS; j++) {

adjMat[i][j] = 0;

}

}

}

public void addNode(char label){

nodeList[nVerts++] = new GraphNodeBean(label);

}

public void addEdge(int start,int end){

adjMat[start][end] = 1;

adjMat[end][start] = 1;

}

public void displayGraphNode(int v){

System.out.println(nodeList[v].label);

}

/**

* 获得未访问节点

* @param v

* @return

*/

public int getAdjUnvisitedVertex(int v){

for (int i = 0; i < nVerts; i++) {

if(adjMat[v][i]==1 && nodeList[i].isVisited == false)

return i;

}

return -1;

}

/**

* deft first

*/

public void dfs(){

@SuppressWarnings("rawtypes")

Stack theStack = new Stack();

nodeList[0].isVisited = true;

displayGraphNode(0);

theStack.push(0);

while(!theStack.isEmpty()){

int v = getAdjUnvisitedVertex(theStack.peek());

if(v == -1)

theStack.pop();

else{

nodeList[v].isVisited = true;

displayGraphNode(v);

theStack.push(v);

}

}

//for (int i = 0; i < nVerts; i++) {

//nodeList[i].isVisited = false;

//}

}

public void bds(){

Queue theQueue = new LinkedList();

nodeList[0].isVisited = true;

displayGraphNode(0);

theQueue.offer(0);

int v2;

while(!theQueue.isEmpty()){

int v1 = theQueue.poll();

while((v2 = getAdjUnvisitedVertex(v1)) != -1){

nodeList[v2].isVisited = true;

displayGraphNode(v2);

theQueue.add(v2);

}

}

//for (int i = 0; i < nVerts; i++) {

//nodeList[i].isVisited = false;

//}

}

}

其中dfs是深度优先算法

bfs是广度优先算法

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2012-11-15 17:43

浏览 5928

评论

1 楼

chenbaohua518

2013-10-08

你的头像照片是你的女神?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值