1. 程式人生 > >小鎮網(最小生成樹)

小鎮網(最小生成樹)

方案 ac代碼 簡單的 int scrip 矩陣 安排 con ems

Description 農民約翰被選為他們鎮的鎮長!

他當中一個競選承諾就是在鎮上建立起互聯網。並連接到全部的農場。當然,他須要你的幫助。約翰已經給他的農場安排了一條快速的網絡線路。他想把這條線路共享給其它農場。為了使花費最少。他想鋪設最短的光纖去連接全部的農場。

你將得到一份各農場之間連接費用的列表。你必須找出能連接全部農場並所用光纖最短的方案。每兩個農場間的距離不會超過100000
Input 第一行: 農場的個數,N(3<=N<=100)。

第二行..結尾: 後來的行包括了一個N*N的矩陣,表示每一個農場之間的距離。理論上,他們是N行,每行由N個用空格分隔的數組成,實際上,他們限制在80個字符,因此,某些行會緊接著還有一些行。

當然,對角線將會是0。由於不會有線路從第i個農場到它本身。
Output 僅僅有一個輸出,當中包括連接到每一個農場的光纖的最小長度。
Sample Input 4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0

Sample Output 28
解題思路:
簡單的prime算法應用。只是多贅述。
AC代碼:

#include <stdio.h>
#include <string.h>
#define MAX_NUM 105
int map[MAX_NUM][MAX_NUM], n;
int prime()
{
    int pos, min, result = 0, visited[MAX_NUM], low[MAX_NUM];
    memset(visited, 0, sizeof(visited));
    visited[1] = 1;  
    pos = 1;        
    for(int i = 1; i <= n; i++)
        if(i != pos)
            low[i] = map[pos][i];
    for(int i = 1; i < n; i++)
    {
        min = 100000000;
        for(int j = 1; j <= n; j++)
        {
            if(visited[j] == 0 && low[j] < min)
            {
                min = low[j];
                pos = j;
            }
        }
        result += min;
        visited[pos] = 1;
        for(int j = 1; j <= n; j ++)
        {
            if(visited[j] == 0 && low[j] > map[pos][j])
                low[j] = map[pos][j];
        }
    }
    return result;
}
int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <=n; j++)
        {
            scanf("%d", &map[i][j]);
            if(map[i][j] == 0)
                map[i][j] = 1000000;
        }
    printf("%d\n", prime());
    return 0;
}


小鎮網(最小生成樹)