算法:用Java實現圖論算法中的拓撲排序,並應用拓撲排序安排課程表

本文我打算用Java實現圖論算法中的拓撲排序,並應用拓撲排序安排課程表。課程表就是很常規的那種Java學習的簡單路線圖,首先下圖就是Java課程學習的一個拓撲順序圖:
在這裏插入圖片描述
上面這張圖是什麼意思呢?黑色的字就代表要學習的課程,而紅色的箭頭就代表課程學習的拓撲順序,課程之間是有依賴的,箭頭代表課程學習順序:

  1. 最左邊的Java、SQL、HTML、CSS這類課程則不需要提前學習任何課程,即可開始學習
  2. 想學習Servlet課程,你就需要先學習Java課程,然後才能學習Servlet課程
  3. 想學習JSP課程,你就得先學習Java課程和JavaScript課程,而學習JavaScript課程,就得先學習HTML和CSS課程

從上面的解讀例子中,你應該明白了,課程學習是有依賴關係的,不是你想按照什麼順序來學都可以的。你只學了Servlet和JSP,沒學過SQL,是無法學習SSM的(大家都懂的)。從上面的課程拓撲順序可以看出,部分課程的學習都是在其他的課程學習完畢後,才能開始學習的,其依賴關係如下:

  • Java:先決條件:無
  • HTML:先決條件:無
  • CSS:先決條件:無
  • SQL:先決條件:無
  • JavaScript:先決條件:HTML、CSS
  • Servlet:先決條件:Java
  • JSP:先決條件:Java、JavaScript
  • SSM:先決條件:JSP、Servlet、SQL
  • SpringBoot:先決條件:SSM

其實上面的課程拓撲順序,也可以看做是一個有向無環圖,也就是傳說中的DAG圖。如何按照上面的學習依賴順序,安排所有課程的學習順序呢?這裏就用圖論算法中的拓撲排序算法。

首先,我們構建上面的課程拓撲順序圖的鄰接矩陣:
在這裏插入圖片描述
從上面的鄰接矩陣圖中可以看出,豎着的列,是1的就指着自己。比如SSM,豎着下來有3個1,橫過去看,就是SQL、Servlet和JSP指着它。所以說,我們可以通過豎着數1的個數,來判斷有多少課程指着自己,在圖論中,就叫一個頂點的入度。在有向圖中,如果有N條邊的箭頭指向某個頂點,就說這個頂點的入度是N。當然某一列的所有數字都是0,則代表這個頂點的入度是0,沒有任何其他頂點指着它。

拓撲排序的思路如下:

  1. 先找到入度爲0的頂點(排序List中不能存在),就是頂點的那一列全是0,如果有多個,就取其一,放入排序List中
  2. 放入後,在鄰接矩陣中刪除該頂點及其出去的邊,也就是將頂點的那一行全部弄成0
  3. 再繼續找入度爲0的頂點,重複3,然後再接着重複4,直到排序List中的排序元素個數與頂點個數相等,或者說找不到入度爲0且排序List中不存在的頂點了,完成拓撲排序

接下來就是我用Java實現的拓撲排序,實現上面課程的順序安排方案(所有可行的方案),算法的代碼和精髓都在下面的代碼和其間詳盡的註釋中:

import java.util.ArrayList;
import java.util.List;

/**
 * @author LiYang
 * @ClassName TopologicalSort
 * @Description 圖論算法中的拓撲排序
 * @date 2019/11/18 18:33
 */
public class TopologicalSort {

    /**
     * 返回示例圖的鄰接矩陣
     * @return 示例圖鄰接矩陣
     */
    public static int[][] initCourseMatrix() {
        //創建示例圖鄰接矩陣
        return new int[][]{
                {0, 0, 0, 0, 0, 1, 1, 0, 0},
                {0, 0, 0, 0, 1, 0, 0, 0, 0},
                {0, 0, 0, 0, 1, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 1, 0},
                {0, 0, 0, 0, 0, 0, 1, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 1, 0},
                {0, 0, 0, 0, 0, 0, 0, 1, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 1},
                {0, 0, 0, 0, 0, 0, 0, 0, 0}
        };
    }

    /**
     * 拷貝matrix矩陣
     * @param matrix 源鄰接矩陣
     * @return 拷貝的鄰接矩陣
     */
    public static int[][] copyMatrix(int[][] matrix) {
        //新的鄰接矩陣,和原來的一樣大,正方形
        int[][] newMatrix = new int[matrix.length][matrix.length];
        
        //雙重遍歷拷貝
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix.length; j++) {
                newMatrix[i][j] = matrix[i][j];
            }
        }
        
        //返回拷貝的副本鄰接矩陣
        return newMatrix;
    }

    /**
     * 拷貝List
     * @param order 源orderList
     * @return 拷貝的副本orderList
     */
    public static List<Integer> copyList(List<Integer> order) {
        //拷貝的List
        List<Integer> copyList = new ArrayList<>();
        
        //拷貝
        for (Integer item : order) {
            copyList.add(item);
        }
        
        //返回拷貝的副本
        return copyList;
    }

    /**
     * 打印課程順序表
     * @param order 課程排序表
     * @param courseName 課程名字
     */
    public static void printCourseOrderTable(List<Integer> order, String[] courseName) {
        //課程表名字List
        List<String> courseTable = new ArrayList<>();
        
        //依據排好序的orderList,提取並加入課程名
        for (Integer item : order) {
            courseTable.add(courseName[item]);
        }
        
        //組裝課程順序表字符串
        String courseList = courseTable.toString().replaceAll("\\[", "")
                .replaceAll("]", "").replaceAll(", ", " -> ");
        
        //打印課程順序表
        System.out.println(courseList);
    }

    /**
     * 拓撲排序(安排示例課程圖的課程表)
     * @param matrix 課程拓撲順序的鄰接矩陣
     * @param order 課程順序List
     * @param courseName 課程名稱字符串數組
     */
    public static void topologicalSort(int[][] matrix, List<Integer> order, String[] courseName) {
        //如果所有課程已經排完序了
        if (order.size() == matrix.length) {
            
            //打印排好序的課程順序表
            printCourseOrderTable(order, courseName);
            
            //結束遞歸
            return;
        }

        //遍歷找入度爲0的課程
        for (int i = 0; i < matrix.length; i++) {
            //如果當前課程已經在拓撲排序列表裏面了 
            if (order.contains(i)) {
                //略過,不作處理
                continue;
            }
            
             //判斷課程是否全是0,也就是入度爲0
            boolean allZero = true;
            
            //遍歷查看是否是入度爲0
            for (int j = 0; j < matrix.length; j++) {
                if (matrix[j][i] > 0) {
                    allZero = false;
                    break;
                }
            }
            
            //如果課程入度爲0,則可以用於拓撲排序的下一門課程
            if (allZero) {
                
                //複製當前排序表
                List<Integer> newOrder = copyList(order);
                
                //加入當前課程
                newOrder.add(i);
                
                //複製當前的鄰接矩陣
                int[][] newMatrix = copyMatrix(matrix);

                //將當前已加入的課程刪除,同時刪除頂點和邊
                for (int k = 0; k < matrix.length; k++) {
                    newMatrix[i][k] = 0;
                }
                
                //繼續往下,遞歸進行拓撲排序
                topologicalSort(newMatrix, newOrder, courseName);
            }
        }
    }

    /**
     * 拓撲排序的驅動程序
     * @param matrix 課程拓撲順序的鄰接矩陣
     * @param courseName 課程名字
     */
    public static void topologicalSort(int[][] matrix, String[] courseName) {
        //新建一個課程排序表
        List<Integer> order = new ArrayList<>();
        
        //啓動課程表的拓撲排序
        topologicalSort(matrix, order, courseName);
    }

    /**
     * 運行拓撲排序算法,求出示例圖中的所有課程安排方案
     * @param args
     */
    public static void main(String[] args) {
        //獲得示例圖的鄰接矩陣
        int[][] matrix = initCourseMatrix();
        
        //課程名稱的字符串數組
        String[] courseName = new String[]{"Java", "HTML", "CSS", "SQL", "JavaScript", "Servlet", "JSP", "SSM", "SpringBoot"};
        
        //運行拓撲排序,求出示例圖中的所有課程安排方案
        topologicalSort(matrix, courseName);
    }
    
}

運行TopologicalSort類的main方法,執行課程的拓撲排序算法,控制檯打印了所有的可行的課程安排方案,測試通過:

Java -> HTML -> CSS -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> HTML -> CSS -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
Java -> HTML -> CSS -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
Java -> HTML -> CSS -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> HTML -> CSS -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> HTML -> SQL -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> HTML -> SQL -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> HTML -> SQL -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> SQL -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> Servlet -> CSS -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> HTML -> Servlet -> CSS -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> HTML -> Servlet -> CSS -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> HTML -> Servlet -> SQL -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> CSS -> HTML -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
Java -> CSS -> HTML -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
Java -> CSS -> HTML -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> CSS -> HTML -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> CSS -> SQL -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> CSS -> SQL -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> CSS -> SQL -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> SQL -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> Servlet -> HTML -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> CSS -> Servlet -> HTML -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> CSS -> Servlet -> HTML -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> CSS -> Servlet -> SQL -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> HTML -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> SQL -> HTML -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> SQL -> HTML -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> HTML -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> CSS -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
Java -> SQL -> CSS -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
Java -> SQL -> CSS -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> CSS -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> Servlet -> HTML -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> SQL -> Servlet -> CSS -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> HTML -> CSS -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> HTML -> CSS -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> Servlet -> HTML -> CSS -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> Servlet -> HTML -> SQL -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> CSS -> HTML -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> CSS -> HTML -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
Java -> Servlet -> CSS -> HTML -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
Java -> Servlet -> CSS -> SQL -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> SQL -> HTML -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
Java -> Servlet -> SQL -> CSS -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> Java -> CSS -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
HTML -> Java -> CSS -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
HTML -> Java -> CSS -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
HTML -> Java -> CSS -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
HTML -> Java -> SQL -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> Java -> SQL -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> Java -> SQL -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> SQL -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> Servlet -> CSS -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> Java -> Servlet -> CSS -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
HTML -> Java -> Servlet -> CSS -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
HTML -> Java -> Servlet -> SQL -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> Java -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> Java -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
HTML -> CSS -> Java -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
HTML -> CSS -> Java -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
HTML -> CSS -> SQL -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> SQL -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> SQL -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> CSS -> SQL -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> SQL -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> Java -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> SQL -> Java -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> CSS -> JavaScript -> SQL -> Java -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> SQL -> Java -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> SQL -> Java -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> SQL -> Java -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> SQL -> Java -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> SQL -> CSS -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> SQL -> CSS -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
HTML -> SQL -> CSS -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
HTML -> SQL -> CSS -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
HTML -> SQL -> CSS -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> Java -> HTML -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> Java -> HTML -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
CSS -> Java -> HTML -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
CSS -> Java -> HTML -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
CSS -> Java -> HTML -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
CSS -> Java -> SQL -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> Java -> SQL -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> Java -> SQL -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> SQL -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> Servlet -> HTML -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> Java -> Servlet -> HTML -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
CSS -> Java -> Servlet -> HTML -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
CSS -> Java -> Servlet -> SQL -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> SQL -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> SQL -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> Java -> SQL -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> Java -> JavaScript -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
CSS -> HTML -> Java -> Servlet -> SQL -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> Servlet -> JavaScript -> SQL -> JSP -> SSM -> SpringBoot
CSS -> HTML -> Java -> Servlet -> JavaScript -> JSP -> SQL -> SSM -> SpringBoot
CSS -> HTML -> SQL -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> SQL -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> SQL -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> HTML -> SQL -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> SQL -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> SQL -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> SQL -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> Servlet -> SQL -> JSP -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> Servlet -> JSP -> SQL -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> JSP -> SQL -> Servlet -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> Java -> JSP -> Servlet -> SQL -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> SQL -> Java -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> HTML -> JavaScript -> SQL -> Java -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> SQL -> Java -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> SQL -> Java -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> SQL -> Java -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> SQL -> Java -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> SQL -> HTML -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> SQL -> HTML -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
CSS -> SQL -> HTML -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
CSS -> SQL -> HTML -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
CSS -> SQL -> HTML -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> Java -> HTML -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> Java -> HTML -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> Java -> HTML -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> HTML -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> CSS -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> Java -> CSS -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> Java -> CSS -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> CSS -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> Servlet -> HTML -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> Java -> Servlet -> CSS -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> HTML -> Java -> CSS -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> HTML -> Java -> CSS -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> HTML -> Java -> CSS -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> HTML -> Java -> Servlet -> CSS -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> HTML -> CSS -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> HTML -> CSS -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> HTML -> CSS -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> HTML -> CSS -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> HTML -> CSS -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> CSS -> Java -> HTML -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> CSS -> Java -> HTML -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> CSS -> Java -> HTML -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> CSS -> Java -> Servlet -> HTML -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> CSS -> HTML -> Java -> JavaScript -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> CSS -> HTML -> Java -> JavaScript -> JSP -> Servlet -> SSM -> SpringBoot
SQL -> CSS -> HTML -> Java -> Servlet -> JavaScript -> JSP -> SSM -> SpringBoot
SQL -> CSS -> HTML -> JavaScript -> Java -> Servlet -> JSP -> SSM -> SpringBoot
SQL -> CSS -> HTML -> JavaScript -> Java -> JSP -> Servlet -> SSM -> SpringBoot
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章