浙江大學MOOC數據結構-陳越、何欽銘 程式設計練習題(第八講)

2020-08-11 23:45:11

浙江大學MOOC數據結構-陳越、何欽銘 程式設計練習題(第八講)

在这里插入图片描述
程式設計說明
程式設計環境:平臺執行
程式語言:C

第一題程式碼

參考自https://www.cnblogs.com/minesweeper/p/6114804.html

Prim

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

#define INF 10000

int N, M;
int TotalCost = 0;
int Cost_Matrix[1001][1001];
int dist[1001];

void Init();
int Prim();
int Find_Min();

int main()
{
    Init();
    printf("%d", Prim());
    return 0;
}

void Init()
{
    int v1, v2, cost;
    //獲取城鎮數目、道路條數
    scanf("%d %d", &N, &M);

    //初始化鄰接矩陣
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= N; j++)
        {
            if(i != j)
                Cost_Matrix[i][j] = INF;
            else
                Cost_Matrix[i][j] = 0;
        }

    //獲取鄰接矩陣的權值
    for(int i = 1; i <= M; i++)
    {
        scanf("%d %d %d", &v1, &v2, &cost);
        Cost_Matrix[v1][v2] = cost;
        Cost_Matrix[v2][v1] = cost;
    }
}

int Prim()
{
    int k;
    for(int i = 1; i <= N ;i++)
    {
        dist[i] = Cost_Matrix[1][i];
    }

    for(int i = 1; i < N; i++)  /* 生成樹還需要收n-1個節點 */
    {
        k = Find_Min();

        if(!k) //k=0,表示找不到dist[V]最小者,則跳出
            return -1;
        else   //k!=0說明找到dist[V]最小者
        {
            //將V收錄進最小生成樹,並累加器長度
            TotalCost += dist[k];
            dist[k] = 0;

            //更新V的鄰接點W的dist[W]值
            for(int j = 2; j <= N; j++)
            {
                if(dist[j] && Cost_Matrix[k][j] < dist[j])
                    dist[j] = Cost_Matrix[k][j];
            }
        }
    }

    return TotalCost;
}

int Find_Min()
{
    int k = 0;
    int MinDist = INF;
    for(int i = 2; i <= N ;i++)
    {
        if(dist[i] && dist[i] < MinDist)
        {
            MinDist = dist[i];
            k = i;
        }
    }

    return k;
}