bfs(JAVA)
2016-05-16 12:03
561 查看
宽度优先很容易理解,简单的说就是一圈一圈向外扩展就可以了。import java.util.Scanner;
public class Main {
static int maxn = 200;
static boolean[][] data = new boolean[maxn][maxn]; // 有无边
static int[] visited = new int[maxn]; // 访问标志
static int[] queue = new int[maxn]; // 访问顺序
static int n, m; // 顶点数,边数
static void bfs(int s) {
int i, open, closed;
visited[s] = 0;
queue[1] = s;
open = 1;
closed = 1;
System.out.println("广度优先遍历开始:");
while (open <= closed) {
System.out.println("因为open=" + open + " <= closed=" + closed);
for (i = 1; i <= n; i++) {
if (visited[i] == -1 && data[queue[open]][i]) {
System.out.println("因为visited["+ i + "]= -1 , 并且" + queue[open] + "和" + i + "有边");
System.out.println("所以visited["+ i + "] = visited[" + queue[open] + "] + 1 = " + (visited[queue[open]] + 1)+ ", 所以" + i + "入队列");
visited[i] = visited[queue[open]] + 1;
closed++;
queue[closed] = i;
}
}
open++;
for(int k = 1; k < n; k++) {
System.out.print(queue[k] + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
for(int i = 0; i < m; i++) {
int x = in.nextInt();
int y = in.nextInt();
data[x][y] = true;
}
for(int i = 1; i <= m; i++) {
visited[i] = -1;
}
bfs(1);
for(int i = 1; i < n; i++) {
System.out.print(queue[i] + " ");
}
}
}
例如我们输入:
10 14
1 2
1 3
1 4
2 5
3 5
4 3
4 6
4 7
5 8
6 8
6 3
7 8
7 9
10 8
10 9
则输出为:
广度优先遍历开始:
因为open=1 <= closed=1
因为visited[2]= -1 , 并且1和2有边
所以visited[2] = visited[1] + 1 = 1, 所以2入队列
因为visited[3]= -1 , 并且1和3有边
所以visited[3] = visited[1] + 1 = 1, 所以3入队列
因为visited[4]= -1 , 并且1和4有边
所以visited[4] = visited[1] + 1 = 1, 所以4入队列
1 2 3 4 0 0 0 0 0
因为open=2 <= closed=4
因为visited[5]= -1 , 并且2和5有边
所以visited[5] = visited[2] + 1 = 2, 所以5入队列
1 2 3 4 5 0 0 0 0
因为open=3 <= closed=5
1 2 3 4 5 0 0 0 0
因为open=4 <= closed=5
因为visited[6]= -1 , 并且4和6有边
所以visited[6] = visited[4] + 1 = 2, 所以6入队列
因为visited[7]= -1 , 并且4和7有边
所以visited[7] = visited[4] + 1 = 2, 所以7入队列
1 2 3 4 5 6 7 0 0
因为open=5 <= closed=7
因为visited[8]= -1 , 并且5和8有边
所以visited[8] = visited[5] + 1 = 3, 所以8入队列
1 2 3 4 5 6 7 8 0
因为open=6 <= closed=8
1 2 3 4 5 6 7 8 0
因为open=7 <= closed=8
因为visited[9]= -1 , 并且7和9有边<
4000
br />
所以visited[9] = visited[7] + 1 = 3, 所以9入队列
1 2 3 4 5 6 7 8 9
因为open=8 <= closed=9
1 2 3 4 5 6 7 8 9
因为open=9 <= closed=9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
public class Main {
static int maxn = 200;
static boolean[][] data = new boolean[maxn][maxn]; // 有无边
static int[] visited = new int[maxn]; // 访问标志
static int[] queue = new int[maxn]; // 访问顺序
static int n, m; // 顶点数,边数
static void bfs(int s) {
int i, open, closed;
visited[s] = 0;
queue[1] = s;
open = 1;
closed = 1;
System.out.println("广度优先遍历开始:");
while (open <= closed) {
System.out.println("因为open=" + open + " <= closed=" + closed);
for (i = 1; i <= n; i++) {
if (visited[i] == -1 && data[queue[open]][i]) {
System.out.println("因为visited["+ i + "]= -1 , 并且" + queue[open] + "和" + i + "有边");
System.out.println("所以visited["+ i + "] = visited[" + queue[open] + "] + 1 = " + (visited[queue[open]] + 1)+ ", 所以" + i + "入队列");
visited[i] = visited[queue[open]] + 1;
closed++;
queue[closed] = i;
}
}
open++;
for(int k = 1; k < n; k++) {
System.out.print(queue[k] + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
for(int i = 0; i < m; i++) {
int x = in.nextInt();
int y = in.nextInt();
data[x][y] = true;
}
for(int i = 1; i <= m; i++) {
visited[i] = -1;
}
bfs(1);
for(int i = 1; i < n; i++) {
System.out.print(queue[i] + " ");
}
}
}
例如我们输入:
10 14
1 2
1 3
1 4
2 5
3 5
4 3
4 6
4 7
5 8
6 8
6 3
7 8
7 9
10 8
10 9
则输出为:
广度优先遍历开始:
因为open=1 <= closed=1
因为visited[2]= -1 , 并且1和2有边
所以visited[2] = visited[1] + 1 = 1, 所以2入队列
因为visited[3]= -1 , 并且1和3有边
所以visited[3] = visited[1] + 1 = 1, 所以3入队列
因为visited[4]= -1 , 并且1和4有边
所以visited[4] = visited[1] + 1 = 1, 所以4入队列
1 2 3 4 0 0 0 0 0
因为open=2 <= closed=4
因为visited[5]= -1 , 并且2和5有边
所以visited[5] = visited[2] + 1 = 2, 所以5入队列
1 2 3 4 5 0 0 0 0
因为open=3 <= closed=5
1 2 3 4 5 0 0 0 0
因为open=4 <= closed=5
因为visited[6]= -1 , 并且4和6有边
所以visited[6] = visited[4] + 1 = 2, 所以6入队列
因为visited[7]= -1 , 并且4和7有边
所以visited[7] = visited[4] + 1 = 2, 所以7入队列
1 2 3 4 5 6 7 0 0
因为open=5 <= closed=7
因为visited[8]= -1 , 并且5和8有边
所以visited[8] = visited[5] + 1 = 3, 所以8入队列
1 2 3 4 5 6 7 8 0
因为open=6 <= closed=8
1 2 3 4 5 6 7 8 0
因为open=7 <= closed=8
因为visited[9]= -1 , 并且7和9有边<
4000
br />
所以visited[9] = visited[7] + 1 = 3, 所以9入队列
1 2 3 4 5 6 7 8 9
因为open=8 <= closed=9
1 2 3 4 5 6 7 8 9
因为open=9 <= closed=9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
相关文章推荐
- Java中获取键盘输入值的方法
- Java中随机数的生成
- Java数组基础
- JAVA常用工具总结
- smartupload下载
- 跟着龙哥学JavaWeb(jSP底层分析和Helloworld)
- 一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?
- java的封神之路[转载]
- Java堆内存
- 关于java中注解Annotation的分析介绍
- java+jsp导入excel
- maven基础篇(5)-eclipse构建maven-web项目
- Java并发编程—阻塞队列源码分析
- Java 堆内存和栈内存详解
- java中JLabel设置背景图片
- 【Java】Java NIO
- java 面向对象练习题
- spring配置文件---之数据库切换
- Java多线程学习笔记(二)
- 在java中序列化与反序列化详解(转载)