Implement of Prim's Algorithm

Implementation of Prim's Algorithm

Method 1: 朴素法

getUsedInput() is a magic function that get user input for what we need!

int N = getUserInput();
int[][] graph = getUserInput();
int[] dist = new int[N + 1];
int[] visited = new int[N + 1];



// 习惯是如果不存在就return INF, main函数里调用prim的时候要检查return得结果,是不是INF
public int prim() {
    Arrays.fill(dist, Integer.MAX_VALUE);
    int result = 0;
    
    for (int i = 0; i < N; i++) {
        //找出一个距离现在集合最近的点,这个是算法的核心部分,而不是找的是原点最近的点
        int target = -1;
        for (int j = 1; j <= N; j++) {
            if (!visited[j] && (target == -1 || dist[target] > dist[j])) {
                target= j;
            }
        }
        if (i != 0 && dist[target] == Integer.MAX_VALUE) {
            return Integer.MAX_VALUE;
        }
        // 默认是没有负环
        if (i != 0) {
            result += dist[target];
        }
        
        // 更新target加入以后,与target相邻neighbor到现有MST集合的最短距离
        for(int j = 1; j <= N; j++) {
            dist[j] = Math.min(dist[j], graph[target]);
            // VS dijkstra: dist[j] = Math.min(dist[j], dist[target] + graph[target][j])
            
        }
        visited[target] = true;
    }

    return result; // 注意如果有点不联通则不存在最小生成树
}

Method 2: 堆化实现

Last updated