这是一个有向带权的图

 到 0 的权是 9
1 到 2 的权是 3
1 到 3 的权是 6
1 到 4 的权是 7 2 到 0 的权是 2
2 到 3 的权是 5 3 到 0 的权是 3
3 到 4 的权是 1 4 到 2 的权是 2 0 到 4 的权是 6

遍历思路:
线性数组存放着[v0,v1,v2,v3,v4]
从0号元素开始 i=0;
打印出v0,0入队
0出队,去查找v0的邻接表,找到了v4
打印出v4,4入队
4出队,去查找v4的邻接表,找到了v2
打印出v2,2入队
2出队,去查找v2的邻接表,找到了v0,v3,因为v0是已访问过的
打印出v3,3入队
3出队,去查找v3的邻接表,找到了v0,因为v0是已访问过的
所以此时队列为空,进入下一次循环,i=1;
打印出v1,1入队,接着1出队找邻接表,发现都是已访问过的,队列又为空,进入下一次循环,i=2,直到循环结束

打印顺序是 v0 v4 v2 v3 v1

package com.datastruct;

import java.util.LinkedList;
import java.util.Scanner; public class AlGraph { //边表节点
private static class EdgeNode{
int adjvex; //存储该顶点对应的下标
int weight;
EdgeNode next;
} //顶点表结点
private static class VertexNode{
String data; //顶点信息
EdgeNode firstedge; //边表头指针
}
//图结构
private static class GraphAdjList{ final int MAXVEX = ;
VertexNode adjList[] = new VertexNode[MAXVEX]; // 顶点数组
int numVertexes; // 顶点数
int numEdges; // 边数 public GraphAdjList(){
//adjList尽管有的实例,但其元素都是null,需要为每个元素都申请一个VertexNode的实例 ,不然会空指针异常
for(int i=;i<MAXVEX;i++){ adjList[i] = new VertexNode();
}
}
} public static void createAlGraph(GraphAdjList g){
int i,j,k,w;
EdgeNode e;
Scanner scanner = new Scanner(System.in); System.out.println("输入顶点数和边数:");
g.numVertexes = scanner.nextInt();
g.numEdges = scanner.nextInt();
//录入所有顶点信息
System.out.println("输入所有顶点信息:");
for(i=;i<g.numVertexes;i++){
g.adjList[i].data = scanner.next();
g.adjList[i].firstedge = null;
} //录入边信息
for(k=;k<g.numEdges;k++){
System.out.println("输入顶点vi,vj及两个点之间的权w");
i = scanner.nextInt();
j = scanner.nextInt();
w = scanner.nextInt(); e = new EdgeNode();
e.adjvex = j;
e.weight = w;
//g.adjList[i].firstedge = e;
e.next = g.adjList[i].firstedge;//头插法 步骤1
g.adjList[i].firstedge = e; //头插法 步骤2 }
} public static void print(GraphAdjList g){
int i;
System.out.println("所有顶点:");
for(i=;i<g.numVertexes;i++){
System.out.print(g.adjList[i].data+" ");
} System.out.println();
System.out.println("每个顶点的链接:");
for(i=;i<g.numVertexes;i++){ System.out.print("顶点:"+g.adjList[i].data+" ");
if(null != g.adjList[i].firstedge){
System.out.print(" 第一个下标: "+g.adjList[i].firstedge.adjvex+" ");
System.out.print(" 权: "+g.adjList[i].firstedge.weight+" "); if(null != g.adjList[i].firstedge.next){
EdgeNode e = g.adjList[i].firstedge.next;
visit(e);
}
}
System.out.println();
} } public static void visit(EdgeNode e){
System.out.print(" 下标: "+e.adjvex+" ");
System.out.print(" 权:"+e.weight+" ");
if(null != e.next){
visit(e.next);
}
} //广度优先遍历
public static void BFSTraverse(GraphAdjList g){
boolean visited[] = new boolean[]; int i;
EdgeNode p;
LinkedList queue = new LinkedList();
for(i=;i<g.numVertexes;i++){
visited[i] = false;
}
for(i=;i<g.numVertexes;i++){
if(!visited[i]){
visited[i] = true;
System.out.println(g.adjList[i].data);
queue.addLast(i);
while(queue.size() != ){
int index = (int)queue.removeFirst();
p = g.adjList[index].firstedge;
while(null != p){
if(!visited[p.adjvex]){
visited[p.adjvex] = true;
System.out.println(g.adjList[p.adjvex].data);
queue.addLast(p.adjvex);
}
if(null == p.next){
p = null;
}else{
p = p.next;
}
}
}
}
} } public static void main(String[] args) {
GraphAdjList g = new GraphAdjList();
createAlGraph(g);//创建图
print(g);//打印图的信息
BFSTraverse(g);//遍历图 } }

邻接表的广度优先遍历(java版)的更多相关文章

  1. SDUT 2142 数据结构实验之图论二:基于邻接表的广度优先搜索遍历

    数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Descript ...

  2. SDUT2142数据结构实验之图论二:基于邻接表的广度优先搜索遍历

    http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2142&cid=1186 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜 ...

  3. 【数据结构】图的基本操作——图的构造(邻接矩阵,邻接表),遍历(DFS,BFS)

    邻接矩阵实现如下: /* 主题:用邻接矩阵实现 DFS(递归) 与 BFS(非递归) 作者:Laugh 语言:C++ ***************************************** ...

  4. 邻接表有向图(三)之 Java详解

    前面分别介绍了邻接表有向图的C和C++实现,本文通过Java实现邻接表有向图. 目录 1. 邻接表有向图的介绍 2. 邻接表有向图的代码说明 3. 邻接表有向图的完整源码 转载请注明出处:http:/ ...

  5. 邻接表无向图(三)之 Java详解

    前面分别介绍了邻接表无向图的C和C++实现,本文通过Java实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http:/ ...

  6. 基于邻接表的广度优先搜索遍历(bfs)

    题目:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2142&cid=1186 #include<stdio.h> #incl ...

  7. 邻接矩阵的深度优先遍历(java版)

    这是一个有向边带权的图 顶点数组:[v0, v1, v2, v3, v4] 边数组: v0 v1 v2 v3 v4 v0 6 v1 9 3 v2 2 5 v3 1 v4 package com.dat ...

  8. catch that cow (bfs 搜索的实际应用,和图的邻接表的bfs遍历基本上一样)

    Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 38263   Accepted: 11891 ...

  9. 数据结构之 图论---bfs(邻接表)

    数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索( ...

随机推荐

  1. VisualStudio2013 如何打开之前版本开发的(.vdproj )安装项目

    当你的项目使用早于 visualstudio2013 的版本开发并且使用 Visual Studio Installer 制作安装项目时,在升级至 VS2013 后会发现新安装项目无法打开, VS20 ...

  2. runtime梳理。

    一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数. 对于OC的函数,属于 ...

  3. 【Reading Note】Python读书杂记

    赋值 >>> list=[] >>> app=[list,list,list] >>> app [[], [], []] >>> ...

  4. 就这么漂来漂去---一个毕业三个月的java程序员的裸辞风波

    注:这并不是一篇技术文章,而是记录了我这几个月经历的入职,裸辞,找工作的心路历程,简单介绍一个博主的情况,我是16年毕业生,校招进了一家北京的公司,java开发,和很多年轻人一样,干了一段时间,我发现 ...

  5. 数据的双向绑定 Angular JS

    接触AngularJS许了,时常问自己一些问题,如果是我实现它,会在哪些方面选择跟它相同的道路,哪些方面不同.为此,记录了一些思考,给自己回顾,也供他人参考. 初步大致有以下几个方面: 数据双向绑定 ...

  6. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  7. jsp富文本图片和数据上传

    好记性不如烂笔头,记录一下. 2016的最后一天,以一篇博客结尾迎接新的一年. 此处用的富文本编辑器是wangEditor,一款开源的轻量级的富文本编辑器,这里着重说一下里面的图片上传功能. 服务器端 ...

  8. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  9. Ubuntu下利用Mono,Jexus搭建Asp.Net(MVC) Web服务器

    最近在Ubuntu上搭建了Asp.Net的Web服务器,其中遇到很多问题,整理一下思路,以备后用. 搭建环境以及配套软件 Ubuntu: 11.10 Mono:3.0.6 下载地址(http://do ...

  10. centos7+mono4.2.3.4+jexus5.8.1跨平台起飞

    很早之前就开始关注.net跨平台,最近正好测试了下用EF6连接mysql,于是就想直接把网站扔进Linux.查了很多资料,鼓捣了两个晚上,终于成功. 这里我使用的是budgetvm的1G openvz ...