Files
hello-algo/ja/codes/java/chapter_graph/graph_adjacency_matrix.java
Yudong Jin d7b2277d2b Re-translate the Japanese version (#1871)
* Retranslate Japanese docs with GPT-5.4

* Retranslate Japanese code with GPT-5.4
2026-03-30 07:30:15 +08:00

132 lines
4.4 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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);
}
// 辺を追加
// 注意edges の各要素は頂点インデックスを表し、vertices の要素インデックスに対応する
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);
// 隣接行列に 1 行追加
List<Integer> newRow = new ArrayList<>(n);
for (int j = 0; j < n; j++) {
newRow.add(0);
}
adjMat.add(newRow);
// 隣接行列に 1 列追加
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 は vertices の要素インデックスに対応する
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 は vertices の要素インデックスに対応する
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) {
/* 無向グラフを初期化 */
// edges の要素は頂点インデックス、すなわち vertices の要素インデックスに対応する点に注意
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();
}
}