public class DfsBfs {
private int[][] adj;
private int n;
private int[] visited;
private Queue<Integer> queue;
/** @param adj 隣接行列 */
public DfsBfs(int[][] adj) {
this.adj = adj;
n = adj.length;
visited = new int[n];
queue = new LinkedList<Integer>();
}
public void dfs() {
System.out.println("## 深さ優先検索");
for (int i = 0; i < n; i++) {
visited[i] = 0;
}
for (int i = 0; i < n; i++) {
if (visited[i] == 0) {
dfsVisit(i);
}
}
}
private void dfsVisit(int u) {
System.out.println(" 現在" + (u + 1) + "を訪問");
visited[u] = 1;
for (int i = 0; i < n; i++) {
if ((visited[i] == 0) && (adj[u][i] == 1)) {
dfsVisit(i);
}
}
}
public void bfs() {
System.out.println("## 幅優先検索");
for (int i = 0; i < n; i++) {
visited[i] = 0;
}
for (int i = 0; i < n; i++) {
if (visited[i] == 0) {
bfsVisit(i);
}
}
}
private void bfsVisit(int u) {
enqueue(u);
while (!headEqualsTail()) {
int s = dequeue();
if (visited[s] == 0) {
System.out.println(" 現在" + (s + 1) + "をはじめて訪問");
}
visited[s] = 1;
for (int i = 0; i < n; i++) {
if ((adj[s][i] == 1) && (visited[i] == 0)) {
enqueue(i);
}
}
}
}