【アルゴリズム】グラフとJava実装コードの共通アルゴリズム

グラフの一般的なアルゴリズムには、深さ優先検索 (DFS)、幅優先検索 (BFS)、最短経路アルゴリズム (ダイクストラ アルゴリズムおよびベルマン フォード アルゴリズム)、最大フロー アルゴリズム (フォード ファルカーソン アルゴリズムおよびエドモンズ カープ アルゴリズム) などが含まれます。 。これらのアルゴリズムの Java の例を以下に示します。

1. 深さ優先検索 (DFS)

public void dfs(int v, boolean[] visited, List<List<Integer>> adjList) {
    
    
    visited[v] = true;
    System.out.print(v + " ");
    for (int i = 0; i < adjList.get(v).size(); i++) {
    
    
        int u = adjList.get(v).get(i);
        if (!visited[u]) {
    
    
            dfs(u, visited, adjList);
        }
    }
}

2. 幅優先検索 (BFS)

public void bfs(int s) {
    
    
    Queue<Integer> queue = new LinkedList<>();
    boolean[] visited = new boolean[V];
    visited[s] = true;
    queue.offer(s);
    while (!queue.isEmpty()) {
    
    
        int v = queue.poll();
        System.out.print(v + " ");
        for (int u : adjList[v]) {
    
    
            if (!visited[u]) {
    
    
                visited[u] = true;
                queue.offer(u);
            }
        }
    }
}

3. 最短経路アルゴリズム(ダイクストラアルゴリズム)

public double[] dijkstra(int s) {
    
    
    double[] dist = new double[V];
    for (int i = 0; i < V; i++) {
    
    
        dist[i] = Double.POSITIVE_INFINITY;
    }
    dist[s] = 0;
    boolean[] visited = new boolean[V];
    PriorityQueue<Node> pq = new PriorityQueue<>();
    pq.offer(new Node(s, 0));
    while (!pq.isEmpty()) {
    
    
        Node node = pq.poll();
        int v = node.v;
        if (visited[v]) {
    
    
            continue;
        }
        visited[v] = true;
        for (int u : adjList[v]) {
    
    
            double d = dist[v] + weight(v, u);
            if (dist[u] > d) {
    
    
                dist[u] = d;
                pq.offer(new Node(u, d));
            }
        }
    }
    return dist;
}

4. 最短経路アルゴリズム(ベルマン・フォードアルゴリズム)

public void bellmanFord(int s) {
    
    
    double[] dist = new double[V];
    for (int i = 0; i < V; i++) {
    
    
        dist[i] = Double.POSITIVE_INFINITY;
    }
    dist[s] = 0;
    for (int i = 1; i <= V - 1; i++) {
    
    
        for (int j = 0; j < V; j++) {
    
    
            for (int k = 0; k < adjList[j].size(); k++) {
    
    
                int u = adjList[j].get(k);
                double d = dist[j] + weight(j, u);
                if (dist[u] > d) {
    
    
                    dist[u] = d;
                } else if (dist[u] == d && rand.nextDouble() < 0.5) {
    
     // 处理负权环问题,随机选择一个路径即可。
                    dist[u] = d;
                }
            }
        }
    }
}

おすすめ

転載: blog.csdn.net/qq_22744093/article/details/132467840