mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-11-04 06:07:20 +08:00 
			
		
		
		
	docs: add Japanese translate documents (#1812)
* docs: add Japanese documents (`ja/docs`) * docs: add Japanese documents (`ja/codes`) * docs: add Japanese documents * Remove pythontutor blocks in ja/ * Add an empty at the end of each markdown file. * Add the missing figures (use the English version temporarily). * Add index.md for Japanese version. * Add index.html for Japanese version. * Add missing index.assets * Fix backtracking_algorithm.md for Japanese version. * Add avatar_eltociear.jpg. Fix image links on the Japanese landing page. * Add the Japanese banner. --------- Co-authored-by: krahets <krahets@163.com>
This commit is contained in:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							2487a27036
						
					
				
				
					commit
					954c45864b
				
			
							
								
								
									
										117
									
								
								ja/codes/java/chapter_graph/graph_adjacency_list.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								ja/codes/java/chapter_graph/graph_adjacency_list.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,117 @@
 | 
			
		||||
/**
 | 
			
		||||
 * File: graph_adjacency_list.java
 | 
			
		||||
 * Created Time: 2023-01-26
 | 
			
		||||
 * Author: krahets (krahets@163.com)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package chapter_graph;
 | 
			
		||||
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import utils.*;
 | 
			
		||||
 | 
			
		||||
/* 隣接リストに基づく無向グラフクラス */
 | 
			
		||||
class GraphAdjList {
 | 
			
		||||
    // 隣接リスト、キー: 頂点、値: その頂点のすべての隣接頂点
 | 
			
		||||
    Map<Vertex, List<Vertex>> adjList;
 | 
			
		||||
 | 
			
		||||
    /* コンストラクタ */
 | 
			
		||||
    public GraphAdjList(Vertex[][] edges) {
 | 
			
		||||
        this.adjList = new HashMap<>();
 | 
			
		||||
        // すべての頂点と辺を追加
 | 
			
		||||
        for (Vertex[] edge : edges) {
 | 
			
		||||
            addVertex(edge[0]);
 | 
			
		||||
            addVertex(edge[1]);
 | 
			
		||||
            addEdge(edge[0], edge[1]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* 頂点数を取得 */
 | 
			
		||||
    public int size() {
 | 
			
		||||
        return adjList.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* 辺を追加 */
 | 
			
		||||
    public void addEdge(Vertex vet1, Vertex vet2) {
 | 
			
		||||
        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)
 | 
			
		||||
            throw new IllegalArgumentException();
 | 
			
		||||
        // 辺 vet1 - vet2 を追加
 | 
			
		||||
        adjList.get(vet1).add(vet2);
 | 
			
		||||
        adjList.get(vet2).add(vet1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* 辺を削除 */
 | 
			
		||||
    public void removeEdge(Vertex vet1, Vertex vet2) {
 | 
			
		||||
        if (!adjList.containsKey(vet1) || !adjList.containsKey(vet2) || vet1 == vet2)
 | 
			
		||||
            throw new IllegalArgumentException();
 | 
			
		||||
        // 辺 vet1 - vet2 を削除
 | 
			
		||||
        adjList.get(vet1).remove(vet2);
 | 
			
		||||
        adjList.get(vet2).remove(vet1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* 頂点を追加 */
 | 
			
		||||
    public void addVertex(Vertex vet) {
 | 
			
		||||
        if (adjList.containsKey(vet))
 | 
			
		||||
            return;
 | 
			
		||||
        // 隣接リストに新しい連結リストを追加
 | 
			
		||||
        adjList.put(vet, new ArrayList<>());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* 頂点を削除 */
 | 
			
		||||
    public void removeVertex(Vertex vet) {
 | 
			
		||||
        if (!adjList.containsKey(vet))
 | 
			
		||||
            throw new IllegalArgumentException();
 | 
			
		||||
        // 隣接リストから頂点 vet に対応する連結リストを削除
 | 
			
		||||
        adjList.remove(vet);
 | 
			
		||||
        // 他の頂点の連結リストを走査し、vet を含むすべての辺を削除
 | 
			
		||||
        for (List<Vertex> list : adjList.values()) {
 | 
			
		||||
            list.remove(vet);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* 隣接リストを出力 */
 | 
			
		||||
    public void print() {
 | 
			
		||||
        System.out.println("隣接リスト =");
 | 
			
		||||
        for (Map.Entry<Vertex, List<Vertex>> pair : adjList.entrySet()) {
 | 
			
		||||
            List<Integer> tmp = new ArrayList<>();
 | 
			
		||||
            for (Vertex vertex : pair.getValue())
 | 
			
		||||
                tmp.add(vertex.val);
 | 
			
		||||
            System.out.println(pair.getKey().val + ": " + tmp + ",");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public class graph_adjacency_list {
 | 
			
		||||
    public static void main(String[] args) {
 | 
			
		||||
        /* 無向グラフを初期化 */
 | 
			
		||||
        Vertex[] v = Vertex.valsToVets(new int[] { 1, 3, 2, 5, 4 });
 | 
			
		||||
        Vertex[][] edges = { { v[0], v[1] }, { v[0], v[3] }, { v[1], v[2] },
 | 
			
		||||
                             { v[2], v[3] }, { v[2], v[4] }, { v[3], v[4] } };
 | 
			
		||||
        GraphAdjList graph = new GraphAdjList(edges);
 | 
			
		||||
        System.out.println("\n初期化後、グラフは");
 | 
			
		||||
        graph.print();
 | 
			
		||||
 | 
			
		||||
        /* 辺を追加 */
 | 
			
		||||
        // 頂点 1、2、すなわち v[0]、v[2]
 | 
			
		||||
        graph.addEdge(v[0], v[2]);
 | 
			
		||||
        System.out.println("\n辺 1-2 を追加後、グラフは");
 | 
			
		||||
        graph.print();
 | 
			
		||||
 | 
			
		||||
        /* 辺を削除 */
 | 
			
		||||
        // 頂点 1、3、すなわち v[0]、v[1]
 | 
			
		||||
        graph.removeEdge(v[0], v[1]);
 | 
			
		||||
        System.out.println("\n辺 1-3 を削除後、グラフは");
 | 
			
		||||
        graph.print();
 | 
			
		||||
 | 
			
		||||
        /* 頂点を追加 */
 | 
			
		||||
        Vertex v5 = new Vertex(6);
 | 
			
		||||
        graph.addVertex(v5);
 | 
			
		||||
        System.out.println("\n頂点 6 を追加後、グラフは");
 | 
			
		||||
        graph.print();
 | 
			
		||||
 | 
			
		||||
        /* 頂点を削除 */
 | 
			
		||||
        // 頂点 3、すなわち v[1]
 | 
			
		||||
        graph.removeVertex(v[1]);
 | 
			
		||||
        System.out.println("\n頂点 3 を削除後、グラフは");
 | 
			
		||||
        graph.print();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										131
									
								
								ja/codes/java/chapter_graph/graph_adjacency_matrix.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								ja/codes/java/chapter_graph/graph_adjacency_matrix.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,131 @@
 | 
			
		||||
/**
 | 
			
		||||
 * File: graph_adjacency_matrix.java
 | 
			
		||||
 * Created Time: 2023-01-26
 | 
			
		||||
 * Author: krahets (krahets@163.com)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package chapter_graph;
 | 
			
		||||
 | 
			
		||||
import utils.*;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
 | 
			
		||||
/* 隣接行列に基づく無向グラフクラス */
 | 
			
		||||
class GraphAdjMat {
 | 
			
		||||
    List<Integer> vertices; // 頂点リスト、要素は「頂点値」を表し、インデックスは「頂点インデックス」を表す
 | 
			
		||||
    List<List<Integer>> adjMat; // 隣接行列、行と列のインデックスは「頂点インデックス」に対応
 | 
			
		||||
 | 
			
		||||
    /* コンストラクタ */
 | 
			
		||||
    public GraphAdjMat(int[] vertices, int[][] edges) {
 | 
			
		||||
        this.vertices = new ArrayList<>();
 | 
			
		||||
        this.adjMat = new ArrayList<>();
 | 
			
		||||
        // 頂点を追加
 | 
			
		||||
        for (int val : vertices) {
 | 
			
		||||
            addVertex(val);
 | 
			
		||||
        }
 | 
			
		||||
        // 辺を追加
 | 
			
		||||
        // 辺の要素は頂点インデックスを表す
 | 
			
		||||
        for (int[] e : edges) {
 | 
			
		||||
            addEdge(e[0], e[1]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* 頂点数を取得 */
 | 
			
		||||
    public int size() {
 | 
			
		||||
        return vertices.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* 頂点を追加 */
 | 
			
		||||
    public void addVertex(int val) {
 | 
			
		||||
        int n = size();
 | 
			
		||||
        // 頂点リストに新しい頂点値を追加
 | 
			
		||||
        vertices.add(val);
 | 
			
		||||
        // 隣接行列に行を追加
 | 
			
		||||
        List<Integer> newRow = new ArrayList<>(n);
 | 
			
		||||
        for (int j = 0; j < n; j++) {
 | 
			
		||||
            newRow.add(0);
 | 
			
		||||
        }
 | 
			
		||||
        adjMat.add(newRow);
 | 
			
		||||
        // 隣接行列に列を追加
 | 
			
		||||
        for (List<Integer> row : adjMat) {
 | 
			
		||||
            row.add(0);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* 頂点を削除 */
 | 
			
		||||
    public void removeVertex(int index) {
 | 
			
		||||
        if (index >= size())
 | 
			
		||||
            throw new IndexOutOfBoundsException();
 | 
			
		||||
        // 頂点リストから `index` の頂点を削除
 | 
			
		||||
        vertices.remove(index);
 | 
			
		||||
        // 隣接行列から `index` の行を削除
 | 
			
		||||
        adjMat.remove(index);
 | 
			
		||||
        // 隣接行列から `index` の列を削除
 | 
			
		||||
        for (List<Integer> row : adjMat) {
 | 
			
		||||
            row.remove(index);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* 辺を追加 */
 | 
			
		||||
    // パラメータ i、j は頂点要素のインデックスに対応
 | 
			
		||||
    public void addEdge(int i, int j) {
 | 
			
		||||
        // インデックスの範囲外と等価性を処理
 | 
			
		||||
        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)
 | 
			
		||||
            throw new IndexOutOfBoundsException();
 | 
			
		||||
        // 無向グラフでは、隣接行列は主対角線について対称、すなわち (i, j) == (j, i) を満たす
 | 
			
		||||
        adjMat.get(i).set(j, 1);
 | 
			
		||||
        adjMat.get(j).set(i, 1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* 辺を削除 */
 | 
			
		||||
    // パラメータ i、j は頂点要素のインデックスに対応
 | 
			
		||||
    public void removeEdge(int i, int j) {
 | 
			
		||||
        // インデックスの範囲外と等価性を処理
 | 
			
		||||
        if (i < 0 || j < 0 || i >= size() || j >= size() || i == j)
 | 
			
		||||
            throw new IndexOutOfBoundsException();
 | 
			
		||||
        adjMat.get(i).set(j, 0);
 | 
			
		||||
        adjMat.get(j).set(i, 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* 隣接行列を出力 */
 | 
			
		||||
    public void print() {
 | 
			
		||||
        System.out.print("頂点リスト = ");
 | 
			
		||||
        System.out.println(vertices);
 | 
			
		||||
        System.out.println("隣接行列 =");
 | 
			
		||||
        PrintUtil.printMatrix(adjMat);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
public class graph_adjacency_matrix {
 | 
			
		||||
    public static void main(String[] args) {
 | 
			
		||||
        /* 無向グラフを初期化 */
 | 
			
		||||
        // 辺の要素は頂点インデックスを表す
 | 
			
		||||
        int[] vertices = { 1, 3, 2, 5, 4 };
 | 
			
		||||
        int[][] edges = { { 0, 1 }, { 0, 3 }, { 1, 2 }, { 2, 3 }, { 2, 4 }, { 3, 4 } };
 | 
			
		||||
        GraphAdjMat graph = new GraphAdjMat(vertices, edges);
 | 
			
		||||
        System.out.println("\n初期化後、グラフは");
 | 
			
		||||
        graph.print();
 | 
			
		||||
 | 
			
		||||
        /* 辺を追加 */
 | 
			
		||||
        // 頂点 1、2 のインデックスはそれぞれ 0、2
 | 
			
		||||
        graph.addEdge(0, 2);
 | 
			
		||||
        System.out.println("\n辺 1-2 を追加後、グラフは");
 | 
			
		||||
        graph.print();
 | 
			
		||||
 | 
			
		||||
        /* 辺を削除 */
 | 
			
		||||
        // 頂点 1、3 のインデックスはそれぞれ 0、1
 | 
			
		||||
        graph.removeEdge(0, 1);
 | 
			
		||||
        System.out.println("\n辺 1-3 を削除後、グラフは");
 | 
			
		||||
        graph.print();
 | 
			
		||||
 | 
			
		||||
        /* 頂点を追加 */
 | 
			
		||||
        graph.addVertex(6);
 | 
			
		||||
        System.out.println("\n頂点 6 を追加後、グラフは");
 | 
			
		||||
        graph.print();
 | 
			
		||||
 | 
			
		||||
        /* 頂点を削除 */
 | 
			
		||||
        // 頂点 3 のインデックスは 1
 | 
			
		||||
        graph.removeVertex(1);
 | 
			
		||||
        System.out.println("\n頂点 3 を削除後、グラフは");
 | 
			
		||||
        graph.print();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										55
									
								
								ja/codes/java/chapter_graph/graph_bfs.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								ja/codes/java/chapter_graph/graph_bfs.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,55 @@
 | 
			
		||||
/**
 | 
			
		||||
 * File: graph_bfs.java
 | 
			
		||||
 * Created Time: 2023-02-12
 | 
			
		||||
 * Author: krahets (krahets@163.com)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package chapter_graph;
 | 
			
		||||
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import utils.*;
 | 
			
		||||
 | 
			
		||||
public class graph_bfs {
 | 
			
		||||
    /* 幅優先走査 */
 | 
			
		||||
    // 隣接リストを使用してグラフを表現し、指定した頂点のすべての隣接頂点を取得
 | 
			
		||||
    static List<Vertex> graphBFS(GraphAdjList graph, Vertex startVet) {
 | 
			
		||||
        // 頂点走査順序
 | 
			
		||||
        List<Vertex> res = new ArrayList<>();
 | 
			
		||||
        // ハッシュセット、訪問済みの頂点を記録するために使用
 | 
			
		||||
        Set<Vertex> visited = new HashSet<>();
 | 
			
		||||
        visited.add(startVet);
 | 
			
		||||
        // BFS を実装するために使用するキュー
 | 
			
		||||
        Queue<Vertex> que = new LinkedList<>();
 | 
			
		||||
        que.offer(startVet);
 | 
			
		||||
        // 頂点 vet から開始し、すべての頂点が訪問されるまでループ
 | 
			
		||||
        while (!que.isEmpty()) {
 | 
			
		||||
            Vertex vet = que.poll(); // キューの先頭の頂点をデキュー
 | 
			
		||||
            res.add(vet);            // 訪問した頂点を記録
 | 
			
		||||
            // その頂点のすべての隣接頂点を走査
 | 
			
		||||
            for (Vertex adjVet : graph.adjList.get(vet)) {
 | 
			
		||||
                if (visited.contains(adjVet))
 | 
			
		||||
                    continue;        // すでに訪問済みの頂点をスキップ
 | 
			
		||||
                que.offer(adjVet);   // 未訪問の頂点のみをエンキュー
 | 
			
		||||
                visited.add(adjVet); // 頂点を訪問済みとしてマーク
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // 頂点走査順序を返す
 | 
			
		||||
        return res;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void main(String[] args) {
 | 
			
		||||
        /* 無向グラフを初期化 */
 | 
			
		||||
        Vertex[] v = Vertex.valsToVets(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 });
 | 
			
		||||
        Vertex[][] edges = { { v[0], v[1] }, { v[0], v[3] }, { v[1], v[2] }, { v[1], v[4] },
 | 
			
		||||
                             { v[2], v[5] }, { v[3], v[4] }, { v[3], v[6] }, { v[4], v[5] },
 | 
			
		||||
                             { v[4], v[7] }, { v[5], v[8] }, { v[6], v[7] }, { v[7], v[8] } };
 | 
			
		||||
        GraphAdjList graph = new GraphAdjList(edges);
 | 
			
		||||
        System.out.println("\n初期化後、グラフは");
 | 
			
		||||
        graph.print();
 | 
			
		||||
 | 
			
		||||
        /* 幅優先走査 */
 | 
			
		||||
        List<Vertex> res = graphBFS(graph, v[0]);
 | 
			
		||||
        System.out.println("\n幅優先走査 (BFS) の頂点順序は");
 | 
			
		||||
        System.out.println(Vertex.vetsToVals(res));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										51
									
								
								ja/codes/java/chapter_graph/graph_dfs.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								ja/codes/java/chapter_graph/graph_dfs.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,51 @@
 | 
			
		||||
/**
 | 
			
		||||
 * File: graph_dfs.java
 | 
			
		||||
 * Created Time: 2023-02-12
 | 
			
		||||
 * Author: krahets (krahets@163.com)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package chapter_graph;
 | 
			
		||||
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import utils.*;
 | 
			
		||||
 | 
			
		||||
public class graph_dfs {
 | 
			
		||||
    /* 深さ優先走査の補助関数 */
 | 
			
		||||
    static void dfs(GraphAdjList graph, Set<Vertex> visited, List<Vertex> res, Vertex vet) {
 | 
			
		||||
        res.add(vet);     // 訪問した頂点を記録
 | 
			
		||||
        visited.add(vet); // 頂点を訪問済みとしてマーク
 | 
			
		||||
        // その頂点のすべての隣接頂点を走査
 | 
			
		||||
        for (Vertex adjVet : graph.adjList.get(vet)) {
 | 
			
		||||
            if (visited.contains(adjVet))
 | 
			
		||||
                continue; // すでに訪問済みの頂点をスキップ
 | 
			
		||||
            // 隣接頂点を再帰的に訪問
 | 
			
		||||
            dfs(graph, visited, res, adjVet);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* 深さ優先走査 */
 | 
			
		||||
    // 隣接リストを使用してグラフを表現し、指定した頂点のすべての隣接頂点を取得
 | 
			
		||||
    static List<Vertex> graphDFS(GraphAdjList graph, Vertex startVet) {
 | 
			
		||||
        // 頂点走査順序
 | 
			
		||||
        List<Vertex> res = new ArrayList<>();
 | 
			
		||||
        // ハッシュセット、訪問済みの頂点を記録するために使用
 | 
			
		||||
        Set<Vertex> visited = new HashSet<>();
 | 
			
		||||
        dfs(graph, visited, res, startVet);
 | 
			
		||||
        return res;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void main(String[] args) {
 | 
			
		||||
        /* 無向グラフを初期化 */
 | 
			
		||||
        Vertex[] v = Vertex.valsToVets(new int[] { 0, 1, 2, 3, 4, 5, 6 });
 | 
			
		||||
        Vertex[][] edges = { { v[0], v[1] }, { v[0], v[3] }, { v[1], v[2] },
 | 
			
		||||
                             { v[2], v[5] }, { v[4], v[5] }, { v[5], v[6] } };
 | 
			
		||||
        GraphAdjList graph = new GraphAdjList(edges);
 | 
			
		||||
        System.out.println("\n初期化後、グラフは");
 | 
			
		||||
        graph.print();
 | 
			
		||||
 | 
			
		||||
        /* 深さ優先走査 */
 | 
			
		||||
        List<Vertex> res = graphDFS(graph, v[0]);
 | 
			
		||||
        System.out.println("\n深さ優先走査 (DFS) の頂点順序は");
 | 
			
		||||
        System.out.println(Vertex.vetsToVals(res));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user