最小生成樹c語言

以下是用C語言實現最小生成樹的示例代碼,使用了Prim算法:

#include <stdio.h>
#include <stdlib.h>

#define MAX_VEX 10 // 最大頂點數

// 鄰接矩陣表示圖
int graph[MAX_VEX][MAX_VEX];

// 存儲最小生成樹權重的數組
int min_weight[MAX_VEX];

// 記錄最小生成樹權重的最大值
int max_weight = 0;

// 存儲已訪問的頂點數組
int visited[MAX_VEX];

// Prim算法求解最小生成樹
void prim(int n) {
    // 初始化已訪問數組和最小生成樹權重數組
    for (int i = 0; i < n; i++) {
        visited[i] = 0;
        min_weight[i] = INT_MAX;
    }
    min_weight[0] = 0; // 將第一個頂點加入最小生成樹中
    for (int i = 0; i < n; i++) {
        int min = INT_MAX, j; // 初始化最小權重頂點為未知
        for (int k = 0; k < n; k++) {
            if (!visited[k] && (min > graph[i][k])) { // 如果當前頂點和未訪問頂點之間存在邊且權重小於當前最小權重,更新最小權重頂點
                min = graph[i][k];
                j = k;
            }
        }
        visited[j] = 1; // 將找到的頂點加入已訪問數組中
        min_weight[j] = min_weight[i] + graph[i][j]; // 將找到的邊加入最小生成樹權重數組中
        max_weight = max(max_weight, min_weight[j]); // 更新最大權重
    }
}

int main() {
    int n, m; // n為頂點數,m為邊數
    scanf("%d %d", &n, &m); // 輸入頂點數和邊數
    // 根據鄰接矩陣表示圖輸入每條邊的權重,邊數可按相同格式輸出最小生成樹的權重數組
    printf("最小生成樹的權重數組為:");
    for (int i = 0; i < n; i++) {
        printf("%d ", min_weight[i]); // 輸出最小生成樹的權重數組,第一個頂點權值為0,因為它是最小的生成樹的一部分
    }
    printf("\n"); // 換行符結束輸出結果
    printf("最小生成樹權重的最大值為:%d\n", max_weight); // 輸出最小生成樹權重的最大值
    return 0;
}

這段代碼使用鄰接矩陣表示圖,使用Prim算法求解最小生成樹。它首先初始化已訪問數組和最小生成樹權重數組,並將第一個頂點加入最小生成樹中。然後,它遍歷所有邊,對於每條邊,它找到未訪問的頂點和當前頂點之間的最小權重邊,並將其加入最小生成樹中。最後,它輸出最小生成樹的權重數組和最小生成樹權重的最大值。