java Dijkstra算法 Flod算法

稠密图

package graph;

import org.springframework.util.Assert;

public class DenseGraph {
    private int n, m;
    private boolean directed;
    private int[][] arr;

    DenseGraph(int n, boolean directed) {
        this.n = n;
        this.directed = directed;
        arr = new int[n][n];
    }

    public void addEdge(int v, int t) {
        Assert.isTrue(v < n && v >= 0);
        Assert.isTrue(t < n && t >= 0);
        if (hasEdge(v, t)) return;
        arr[v][t] = 1;
        if (!directed)
            arr[t][v] = 1;
        m++;
    }

    public void addEdge(int v, int t, int w) {
        Assert.isTrue(v < n && v >= 0);
        Assert.isTrue(t < n && t >= 0);
        if (hasEdge(v, t)) return;
        arr[v][t] = w;
        if (!directed)
            arr[t][v] = w;
        m++;
    }

    public void print() {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(arr[i][j] + "   ");
            }
            System.out.println();
        }
    }

    public int[][] getGraph()
    {
        return arr.clone();
    }

    private boolean hasEdge(int v, int t) {
        return arr[v][t] == 1;
    }
}

稀疏图

package graph;

import org.springframework.util.Assert;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class SparseGraph {
    private int n,m;
    private boolean directed;
    private Set<Integer>[] arr;

    SparseGraph(int n,boolean directed)
    {
        this.n=n;
        this.directed=directed;
        arr = new Set[n];
        for (int i=0;i<n;i++)
        {
            arr[i] = new HashSet<>();
        }
    }

    public void addEdge(int v,int t)
    {
        Assert.isTrue(v < n && v >= 0);
        Assert.isTrue(t < n && t >= 0);
        arr[v].add(t);
        if(!directed)
        {
            arr[t].add(v);
        }

        m++;
    }

    public void print()
    {
        for(int i=0;i<n;i++)
        {

            Iterator iterator= arr[i].iterator();
            System.out.print(i + ":  " );
            while (iterator.hasNext())
            {
                System.out.print(iterator.next() + "   " );
            }
            System.out.println();
        }
    }

}

寻路算法

package graph;

import java.util.HashMap;
import java.util.Map;

public class graphTest {
    public static void main(String[] args) {
//        DenseGraph denseGraph= new DenseGraph(10,false);
//        for(int i=0;i<9;i++)
//        {
//            denseGraph.addEdge(i,i+1);
//        }
//        denseGraph.print();
//
//        System.out.println();
//
//        SparseGraph sparseGraph= new SparseGraph(10,false);
//        for(int i=0;i<9;i++)
//        {
//            sparseGraph.addEdge(i,i+1);
//        }
//        sparseGraph.print();

        DenseGraph denseGraph = new DenseGraph(8, false);
        denseGraph.addEdge(0, 1, 1);
        denseGraph.addEdge(1, 2, 3);
        denseGraph.addEdge(1, 3, 1);
        denseGraph.addEdge(1, 5, 4);
        denseGraph.addEdge(2, 3, 4);
        denseGraph.addEdge(2, 4, 6);
        denseGraph.addEdge(3, 6, 2);
        denseGraph.addEdge(4, 5, 1);
        denseGraph.addEdge(4, 7, 4);
        denseGraph.addEdge(5, 6, 7);
        denseGraph.addEdge(5, 7, 1);
        denseGraph.addEdge(6, 7, 8);
        denseGraph.print();

        int[][] arr = denseGraph.getGraph();

        printDijkstraPath(arr,1);
        printFlodPath(arr);

    }

    /**
     * 加权图最短路线算法Dijkstra算法
     *
     * @param arr
     * @param start
     */
    public static void printDijkstraPath(int[][] arr, int start) {
        Map<Integer, Integer> map = new HashMap();
        Map<Integer, Integer> mapalread = new HashMap();
        Map<Integer, String> mapalreadpath = new HashMap();
        int mapfor = 0;
        int n = arr.length;
        for (int i = 0; i < n; i++) {
            map.put(i, 999999999);
        }

        for (int i = 0; i < n; i++) {
            if (arr[start][i] != 0) {
                mapalread.put(i, arr[start][i]);
                mapalreadpath.put(i, start + "->" + i);
                map.remove(i);
            }
        }

        while (map.size() != 0 && mapfor++ < n) {
            ALREADFOR:
            for (Integer key : mapalread.keySet()) {
                for (int i = 0; i < n; i++) {
                    if (arr[key][i] != 0 && i != start) {
                        if (mapalread.containsKey(i)) {
                            if (mapalread.get(i) > arr[key][i] + mapalread.get(key)) {
                                mapalread.put(i, arr[key][i] + mapalread.get(key));
                                mapalreadpath.put(i, mapalreadpath.get(key) + "->" + i);
                            }
                        } else {
                            mapalread.put(i, arr[key][i] + mapalread.get(key));
                            mapalreadpath.put(i, mapalreadpath.get(key) + "->" + i);
                            map.remove(i);
                            break ALREADFOR;
                        }
                    }
                }
            }
        }

        for (Object key : mapalread.keySet()) {
            System.out.println(mapalreadpath.get(key) + " " + mapalread.get(key));
        }
    }

    /**
     * 加权图最短路线算法Flod算法
     *
     * @param arr
     */
    public static void printFlodPath(int[][] arr) {
        System.out.println();
        int n = arr.length;
        int v = 0, w = 0, k = 0;
        int[][] parr = new int[n][n];
        // 初始化数据
        for (v = 0; v < n; ++v) {
            for (w = 0; w < n; ++w) {
                parr[v][w] = v;
            }
        }

        for (k = 0; k < n; ++k) {
            for (v = 0; v < n; ++v) {
                for (w = 0; w < n; ++w) {
                    if (arr[v][k] == 0 || arr[k][w] == 0 || arr[v][w] == 0) continue;
                    if (arr[v][w] > arr[v][k] + arr[k][w]) {
                        arr[v][w] = arr[v][k] + arr[k][w];
                        parr[v][w] = parr[k][w];
                    }
                }
            }
        }

        int temp;
        for (int i = 0; i < n; i++) {
            StringBuilder builder = new StringBuilder();
            for (int j = 0; j < n; j++) { //遍历打印任意亮点的路径
                builder.append(i).append("->").append(j)
                        .append(", weight: "). append(arr[i][j])
                        .append(":").append(i);
                temp = parr[i][j];
                while(temp != i) {
                    builder.append("->").append(temp);
                    temp = parr[temp][j];
                }
                builder.append("->").append(j).append("\n");
            }
            System.out.println(builder.toString());
        }
    }
}

 

posted @ 2019-09-12 16:00  wygflying  阅读(174)  评论(0编辑  收藏  举报