小鎮網(最小生成樹)
阿新 • • 發佈:2017-08-02
方案 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; }
小鎮網(最小生成樹)