您的位置:首页 > 编程语言 > Java开发

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  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: