POJ 2395 Out of Hay 最小生成樹(prime演算法)
阿新 • • 發佈:2018-12-13
題目:
有N(2-2000)個農場,M(1-10000)條通路連通各個農場,長度不超109,要求遍歷全部的農場,且每走1單位長度就要消耗一單位水,每到一個農場可以把自己的水充滿,求最小的水箱容量。
樣例輸入
3 3 1 2 23 2 3 1000 1 3 43
樣例輸出
43
題解:題目的意思大概就是 找到 prime演算法裡面 邊 最大的那一條,所以只需要記錄每次迭代最大的那一條邊即可。
原始碼:
#include <iostream> using namespace std; const int maxn = 2010; const int INF = 0x3f3f3f3f; int n,m; int map[maxn][maxn]; int vis[maxn],lowcast[maxn]; int prime() { int ans = -1; for(int i = 1; i <= n; i++) { //data initi vis[i] = false; lowcast[i] = map[1][i]; } vis[1] = true; // the first index for(int i = 1; i < n; i++) { //loop n - 1 times int k ,min = INF;; for(int j = 1; j <= n; j++) { if(!vis[j] && lowcast[j] < min) { min = lowcast[j]; k = j; } } vis[k] = 1; ans = ans > min ? ans : min; //rember largest cast for(int i = 1; i <= n; i++) { // renew the lowcast if( !vis[i] && lowcast[i] < min) { // find it from 1 lowcast[i] = map[k][i]; } } } return ans; } int main() { while(cin >> n >>m) { int a,b,c; for(int i = 1; i <= n; i++) { //初始化地圖為無窮大 for(int j = 1; j <= n; j++) { map[i][j] = INF; } } for(int i = 0; i < m; i++) { cin >> a >> b >> c; map[a][b] = c; map[b][a] = c; } cout << prime() <<endl; } return 0; }