码迷,mamicode.com
首页 > 其他好文 > 详细

邻接矩阵(以顶点为中心),比较稀疏时,采用邻接表;图的两种遍历(邻接矩阵实现)

时间:2014-05-07 08:02:01      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   java   ext   color   

对于边比较稠密的图,可以采用邻接矩阵(以顶点为中心)的方式表示,而边比较稀疏时,采用邻接表的结构更合适。两种都不能直观表达哪两个点相连或者最短路径是什么。

bubuko.com,布布扣bubuko.com,布布扣

深度优先遍历类似于树的先根序遍历。与树不同的是,它需要对已经访问过的节点添加标记以免被重复遍历。

public class Depth {
/**
 * 对k号节点深度遍历
 * @param a
 * @param color
 * @param k 节点
 */
public static void depthTraversal(int[][] a,int[] color,int k){
System.out.println(k);
color[k]=1;//0未染色,1染色表示遍历过
//找到与k连接的
for(int i=0;i<a[k].length;i++){
if(a[k][i]==1&&color[i]==0){
depthTraversal(a,color,i);
}
}
}
/**
 * @param args
 */
public static void main(String[] args) {
//邻接矩阵标记是否相连,1表示相连,0表示不连
int[][] a={
{0,1,1,1,0},
{1,0,1,1,1},
{1,1,0,1,1},
{1,1,0,0,1},
{1,1,1,1,0}
};

//需要一个数组来记录染色信息,
int[] color=new int[a.length];//int数组内部默认值为0
depthTraversal(a,color,0);
}
}

广度优先遍历类似于对树进行逐层遍历。它按照与开始节点的距离由近到远地进行遍历。当然,因为图的特点,也需要对遍历过的节点做标记。

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;


public class Breadth {


/**
 * @param args
 */
@SuppressWarnings("unchecked")
public static void main(String[] args) {
//邻接矩阵标记是否相连,稠密的图,我们的写法可以是邻接表
int[][] a={
{0,1,1,1,0,1},
{1,0,1,1,1,0},
{1,1,0,0,1,1},
{1,1,0,0,1,0},
{0,1,1,1,0,0},
{1,0,1,0,0,0}
};

//广度遍历
List lst=new ArrayList();//等待遍历
Set set=new HashSet();//保存已遍历的节点

lst.add(0);//先添加个0节点
while(true){
if(lst.isEmpty())break;
int node=(Integer)lst.get(0);
System.out.println(node);
set.add(node);
lst.remove(0);
for(int i=0;i<a[node].length;i++){
//相连,未遍历,lst中不含有该节点(可能这个节点的孩子中存在下个节点的孩子)
if(a[node][i]==1&&set.contains(i)==false&&lst.indexOf(i)==-1){
lst.add(i);
}
}
}
}


}

邻接矩阵(以顶点为中心),比较稀疏时,采用邻接表;图的两种遍历(邻接矩阵实现),布布扣,bubuko.com

邻接矩阵(以顶点为中心),比较稀疏时,采用邻接表;图的两种遍历(邻接矩阵实现)

标签:style   blog   class   java   ext   color   

原文地址:http://blog.csdn.net/needkane/article/details/25075535

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!