프로그래밍/알고리즘

다익스트라(Dijkstra Algorithm)

프리월드 2017. 2. 24. 21:13



class GraphDijkstra {

    final int INFINITY 60000;

    private int[][] adjMat;
    private Vertex[] vertices;
    private int[] distance;

    private int numVertices;

    public GraphDijkstra(int max) {
        adjMat new int[max][max];
        vertices new Vertex[max];
        distance new int[max];

        numVertices 0;

        for (int i = 0i < maxi++) {
            distance[i] = INFINITY;
            for (int j = 0j < maxj++)
                adjMat[i][j] = INFINITY;
        }
    }

    public void addVertex(Vertex v) {
        v.setId(numVertices);
        vertices[numVertices] = v;
        numVertices += 1;
    }

    public void addEdge(Vertex srcVertex dst, int w) {
        adjMat[src.getId()][dst.getId()] = w;
        adjMat[dst.getId()][src.getId()] = w;
    }

    public Vertex getMinVertex() {
        Vertex v = null;
        int temDistance = INFINITY;

        for (int i = 0i < numVerticesi++) {
            //고정되어 있지 않은 꼭지점 중에서 가장 작은 가중치로 연결된 Vertex을 찾는다
            if (!vertices[i].isFixed() && distance[i] < temDistance) {
                temDistance = distance[i];
                v = vertices[i];
            }
        }
        return v;
    }

    public void updateDistance(Vertex v) {
        int tmpDistance;
        for (int i = 0i < numVerticesi++) {
            if (adjMat[v.getId()][i] < INFINITY) {
                //자기와 연결된 꼭지점에 대해서 자기를 지나는 경로의 거리를 계산
                tmpDistance = distance[v.getId()] + adjMat[v.getId()][i];
                if (tmpDistance < distance[i]) {
                    //거리가 더 짧은 경우 정보를 갱신
                    distance[i] = tmpDistance;
                    vertices[i].prev = v;
                }
            }
        }
    }

    public void SPF(Vertex start) {
        Vertex v;
        distance[start.getId()] = 0;
        v = start;

        do {
            v.setFixed();
            updateDistance(v);
            v = getMinVertex();
        while (v != null);

        for (int i = 0i < numVerticesi++) {
            String result[] = new String[numVertices];

            int count = 0;
            v = vertices[i];

            while (v != null) {
                result[count] = v.label;
                count++;
                v = v.prev;
            }
            String log = new String();
            for (int j = count - 1j >= 0j--) {
                log += result[j];
                if (j > 0)
                    log += "->";
            }
            Log.i("kjw"log);
        }
    }

    static public class Vertex {
        private String label;
        private int id;
        private boolean isFix;

        public Vertex prev;

        public Vertex(String label) {
            this.label = label;
            isFix false;
            id = -1;
            prev null;
        }

        public void setId(int id) {
            this.id = id;
        }

        public int getId() {
            return id;
        }

        public void setFixed() {
            this.isFix true;
        }

        public boolean isFixed() {
            return isFix;
        }
    }
}


'프로그래밍 > 알고리즘' 카테고리의 다른 글

Sort(countingSort, radixSort)  (0) 2017.02.24
DFS(미로찾기)  (0) 2017.02.24
이진트리(BinaryTree)  (0) 2017.02.24
quickSort  (0) 2017.02.24
Queue  (0) 2017.02.24