- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章基于Java实现的图的广度优先遍历算法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文以实例形式讲述了基于Java的图的广度优先遍历算法实现方法,具体方法如下:
用邻接矩阵存储图方法:
1.确定图的顶点个数和边的个数 2.输入顶点信息存储在一维数组vertex中 3.初始化邻接矩阵; 4.依次输入每条边存储在邻接矩阵arc中 。
输入边依附的两个顶点的序号i,j; 将邻接矩阵的第i行第j列的元素值置为1; 将邻接矩阵的第j行第i列的元素值置为1; 。
广度优先遍历实现:
1.初始化队列Q 2.访问顶点v;visited[v]=1;顶点v入队Q; 3.while(队列Q非空) 。
v=队列Q的队头元素出队; w=顶点v的第一个邻接点 while(w存在) 。
如果w未被访问,则访问顶点w;visited[w]=1;顶点w入队列Q 。
w=顶点v的下一个邻接点 。
实现代码如下:
- package com.teradata.lsw.sort;
- import java.util.ArrayList;
- import java.util.LinkedList;
- import java.util.List;
- import java.util.Queue;
- public class BFS {
- // 存储节点信息
- private Object[] vertices;
- // 存储边的信息数组
- private int[][] arcs;
- // 边的条数
- private int vexnum;
- // 记录第i个节点是否被访问过
- private boolean[] visited;
- //构建一个临时链表存已经遍历过的节点
- private List<Object> temp = new ArrayList<Object>();
- /**
- * @param args
- *
- * @author TD_LSW
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- BFS g = new BFS(8);
- Character[] vertices = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
- g.addVertex(vertices);
- g.addEdge(0, 1);
- g.addEdge(0, 2);
- g.addEdge(1, 3);
- g.addEdge(1, 4);
- g.addEdge(3, 5);
- g.addEdge(4, 5);
- g.addEdge(2, 6);
- g.addEdge(2, 7);
- System.out.println("图的广度优先遍历:");
- g.bfs();
- }
- // 广度优先遍历实现
- private void bfs() {
- // TODO Auto-generated method stub
- for (int i = 0; i < vexnum; i++) {
- visited[i] = false;
- }
- Queue<Integer> q = new LinkedList<Integer>();
- for (int i = 0; i < vexnum; i++) {
- if (!visited[i]) {
- visited[i] = true;
- visit(i);
- q.add(i);
- while (!q.isEmpty()) {
- int j = (Integer) q.remove().intValue();
- //判断如果全部遍历完了就不需要循环了
- if (temp.size() == vexnum) {
- q.removeAll(q);
- return;
- }
- for (int k = this.firstAdjVex(j); k >= 0; k = this
- .nextAdjVex(j, k)) {
- if (!visited[k]) {
- q.add(k);
- visited[k] = true;
- visit(k);
- }
- }
- }
- }
- }
- }
- // 查找下一个节点
- public int firstAdjVex(int i) {
- for (int j = 0; j < vexnum; j++) {
- if (arcs[i][j] > 0)
- return j;
- }
- return -1;
- }
- public int nextAdjVex(int i, int k) {
- for (int j = k + 1; j < vexnum; j++) {
- if (arcs[i][j] > 0)
- return j;
- }
- return -1;
- }
- // 初始化图的边
- private void addEdge(int i, int j) {
- // TODO Auto-generated method stub
- if (i == j)
- return;
- arcs[i][j] = 1;
- arcs[j][i] = 1;
- }
- // 初始化图的节点
- private void addVertex(Object[] object) {
- // TODO Auto-generated method stub
- this.vertices = object;
- }
- // 图的初始化
- public BFS(int n) {
- // TODO Auto-generated constructor stub
- vexnum = n;
- vertices = new Object[n];
- arcs = new int[n][n];
- visited = new boolean[n];
- for (int i = 0; i < vexnum; i++) {
- for (int j = 0; j < vexnum; j++) {
- arcs[i][j] = 0;
- }
- }
- }
- private void visit(int i) {
- // TODO Auto-generated method stub
- temp.add(vertices[i]);
- System.out.print(vertices[i] + " ");
- }
- }
最后此篇关于基于Java实现的图的广度优先遍历算法的文章就讲到这里了,如果你想了解更多关于基于Java实现的图的广度优先遍历算法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用“laravel/lumen-framework”:“5.7.*” 我有两个中间件,第一个 AuthTokenAuthenticate 应该应用于所有路由,因此它在 bootstrap/ap
当同时播放两个音频时...声音会相互抵消。如何解决这个奇怪的现象? 我有一些代码,其中单击按钮时有音频,并且每隔十秒就有音频(在后台服务中)。我有以下代码来在十秒间隔播放时停止按钮音频,并且工作正常:
我有一个功能可以在我的网站上搜索用户, 我的网站上还有一个面向 friend 的功能。 我有一个查询要在我的网站上搜索正确的用户,并且 我有一个查询可以确定用户的 friend ,他们都按应有的方式工
是否可以对记录使用 GROUP BY? 例如,我有一大堆联系人数据,可能包含也可能不包含所有信息 - 在 CSV 意义上,如果可能看起来像这样: Test User, Address1, Addres
如何在客户端 JavaScript 中创建一个环境,其中与用户界面和 View 相关的任何代码优先于其他代码? 我知道你可以使用 setTimeout([function],0); 将事情推到下一个刻
Jasmine 有没有办法定义测试失败的概率? 例如,现在 500'ing 的服务比不显示在页面上的简单内容更糟糕。 谢谢! 最佳答案 这不是单元或集成测试的工作方式。以太测试是否失败。并且您的套件中
我正在为我参与的一个项目开发一个 API。该 API 将由 Android 应用、iOS 应用和桌面网站使用。几乎所有 API 都只有注册用户才能访问。该 API 允许通过 WSSE 进行身份验证,这
我正在开发一些库并创建了这个有缺陷的代码: //------------------- Gmaps = {}; Gmaps.map = new Gmaps4RailsGoogle(); //there
我有一个使用[NSLocale ISOCountryCodes]获得的国家/地区的NSArray。如何排序此NSArray,以便可以将某些常用国家(地区)放在列表的顶部,同时将其余国家/地区按字母顺序
我正在为注册表编写代码,因为我正在从另一个文件中为电话号码列导入代码,但是当我将该代码放入其中时,您可以看到@include('layouts.phone');它显示为 当我放置@include('l
我刚刚遇到了 javascript 代码 file_upload_started = progress < 100; 我不知道如何阅读它,谷歌也没有真正出现太多。我什至不知道该怎么调用它,所以很难进行
目前,我正在 cppinstitute.org 学习 C 语言认证类(class)。在其中一个测验中,有一个如下的问题来识别输出。 int i = 1,j= 1; int w1,w2; w1 = (i
我想将无符号短值从 MSB 优先转换为 LSB 优先。做了下面的代码,但它不工作。有人可以指出我所做的错误吗 #include using namespace std; int main() {
考虑以下场景:我的应用程序有一些依赖于我自己的 POM 优先 Artifact (使用纯 Maven 构建)和一些依赖于我自己的 list 优先 Artifact (使用 Tycho 构建)。对于 P
拥有它应该是很自然的事情,我想知道是否有来自 TPL DataFlow 库的优先级缓冲区块的现成实现? 最佳答案 似乎实现这一目标的最佳方法是使用专门的 任务调度器 ,而不是实现您自己的 Buffer
我有一个 date 字段,它显示为从今天开始的天数。因此 2055-01-01 和 1950-01-01 将分别显示为正数和负数。现在我希望对这些进行排序,以便非负数按升序排在第一位,然后负数按降序排
我遇到一个问题,我看到我的事件类和悬停类正在 Firebug 中应用,但它没有优先于现有样式。 因此,如果我的元素设置了背景颜色,则事件和悬停背景颜色不会更改元素。 我该如何解决这个问题? 最佳答案
我正在考虑为 Salesforce Outbound Messaging 实现监听器应用程序。 walk through 使用已弃用的 ASMX Web 服务实现它。代码是使用带有/serverInt
对于每个表,EF 都会生成一个部分类,其中所有字段都可以公开访问,例如 public int ID { get; set; } 是否可以将 set 设为私有(private)?然后,我将只允许调用我的
我正在为水电站编写一个数据评估应用程序。我需要从服务器下载数据,该数据就在那里 - 作为 MySQL 表,格式化为 JSON 数组。现在,经过无数个小时的工作,我已经完成了连接到服务器、下载数据并将其
我是一名优秀的程序员,十分优秀!