zoukankan      html  css  js  c++  java
  • java@ 利用ArrayList实现dijkstra算法以及topological 排序算法(java.util.ArrayList)

    package dataStructure;
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Scanner;
    import java.io.*;
    
    class node {
        int to, dist;
        node(int t, int d) {
            to = t;
            dist = d;
        }
    }
    
    public class Graph {
    
        public static void dfs(ArrayList<ArrayList<node> > map, int v, boolean[] vis) {
            vis[v] = true;
            System.out.print(v + "  ");
            
            ArrayList<node> rhs = map.get(v);
            for(int i=0; i<rhs.size(); ++i) {
                int nv = rhs.get(i).to;
                if(!vis[nv])  dfs(map, nv, vis);
            }
        }
        
        public static void bfs(ArrayList<ArrayList<node> > map, int v) {
            boolean[] color = new boolean[map.size()];
            LinkedList<Integer> Q = new LinkedList<Integer> ();
            
            color[v] = true;
            Q.push(v);
            int d = 0;
            System.out.print(v + "(" + d +")   ");
            
            while(!Q.isEmpty()) {
                int top = Q.peek();
                Q.pop();
                ++d;
                
                for(node nc: map.get(top)) {
                    if(!color[nc.to]) {
                        color[nc.to] = true;
                        Q.push(nc.to);
                        System.out.print(nc.to + "(" + d +")   ");
                    }
                }
            }
            
        }
        
        public static void caseInit(ArrayList<ArrayList<node> > map) {
            addEdge(map, 0, 2, 6);
            addEdge(map, 1, 2, 2);
            addEdge(map, 0, 7, 3);
            addEdge(map, 7, 8, 5);
            addEdge(map, 8, 6, 3);
            addEdge(map, 2, 3, 4);
            addEdge(map, 3, 6, 2);
            addEdge(map, 1, 4, 3);
            addEdge(map, 4, 3, 5);
            addEdge(map, 3, 5, 5);
            addEdge(map, 4, 5, 5);
        }
        
        public static void customize(ArrayList<ArrayList<node> > map) {
            Scanner input = new Scanner(System.in);
            while(true) {
                int v = input.nextInt();
                if(v == -1)  break;
                
                 int w = input.nextInt(), d = input.nextInt();
                 addEdge(map, v, w, d);
            }
            input.close();
        }
        
        public static void addEdge(ArrayList<ArrayList<node> > map, int from, int to, int dist) {
            if(from < 0 || from >= map.size() || to < 0 || to >= map.size())  return;
            
            ArrayList<node> rhs = map.get(from);
            rhs.add(new node(to, dist));
            
            //ArrayList<node> rhs2 = map.get(to);
            //rhs2.add(new node(from, dist));
        }
        
        public static int[] dijkstra(ArrayList<ArrayList<node> > map, int v) {
            int[] min_dis = new int[map.size()];
            for(int i=0; i<min_dis.length; ++i) min_dis[i] = Integer.MAX_VALUE;
            for(int i=0; i<map.get(v).size(); ++i) {
                min_dis[map.get(v).get(i).to] = map.get(v).get(i).dist;
            }
                
            boolean[] vis = new boolean[map.size()];
            
            min_dis[v] = 0;
            vis[v] = true;
            ArrayList<node> rhs = map.get(v);
            
            for(int i=1; i<map.size(); ++i) {
                
                int Min = Integer.MAX_VALUE, Minj = v;
                for(int j=0; j<map.size(); ++j) {
                    if(!vis[j] && min_dis[j] < Min) {
                        Min = min_dis[j];
                        Minj = j;
                    }
                }
                
                vis[Minj] = true;
                ArrayList<node> tmp = map.get(Minj);
                
                for(int k=0; k<tmp.size(); ++k) {
                    if(!vis[tmp.get(k).to] && min_dis[Minj] + tmp.get(k).dist < min_dis[tmp.get(k).to]) {
                        min_dis[tmp.get(k).to] = min_dis[Minj] + tmp.get(k).dist;
                    }
                }
            }
            return min_dis;
        }
        
        public static void topologicalSort(ArrayList<ArrayList<node> > map) {
            int[] ind = new int[map.size()];
            for(int i=0; i<map.size(); ++i) {
                for(node nc: map.get(i)) {
                    ++ind[nc.to];
                }
            }
            
            LinkedList<Integer> Q = new LinkedList<Integer> ();
            for(int i=0; i<map.size(); ++i) {
                if(ind[i] == 0) {
                    Q.addLast(i);
                    //System.out.print(i + "  ");
                }
            }
            
            while(!Q.isEmpty()) {
                int top = Q.peek();
                System.out.print(top + "  ");
                Q.poll();
                for(node nc: map.get(top)) {
                    --ind[nc.to];
                    if(ind[nc.to] == 0) Q.addLast(nc.to);
                }
            }
            
        }
        public static void main(String[] args) {
            ArrayList<ArrayList<node> > map = new ArrayList<ArrayList<node> > ();
            
            for(int i=0; i<9; ++i) {
                ArrayList<node> row = new ArrayList<node> ();
                map.add(row);
            }
            caseInit(map);
            
            int[] min_dis = dijkstra(map, 0);
            //for(int i=0; i<min_dis.length; ++i) System.out.print(min_dis[i] + "  ");
            
            //bfs(map, 0);
            
            topologicalSort(map);
        }
    
    }
  • 相关阅读:
    随便练习的进制转换
    回顾快速排序
    常用c++函数
    POJ 1163 The Triangle
    HDU 1155 Bungee Jumping
    ZOJ 3861 Valid Pattern Lock
    POJ 1273 Drainage Ditches
    Hrbust 2240 土豪的时代
    POJ 3468 A Simple Problem with Integers
    POJ 1061 青蛙的约会
  • 原文地址:https://www.cnblogs.com/fu11211129/p/5154525.html
Copyright © 2011-2022 走看看