hdu 1879 最小生成樹 prim演算法實現

2021-06-29 14:18:30 字數 1173 閱讀 1282

這題好詭異,用g++直接超時,c++也就400ms過。。。。

說一下最小生成樹的prim演算法

按照我的理解,它的主要思想就是說:任意取乙個點(通常是第乙個),用乙個dis[i]來儲存終點為 i 的到生成樹中任意一點的最小的距離, 在已經加入生成樹的節點外找乙個點,這個點到生成樹的距離要是最小,(不論是到生成樹的哪乙個節點)。這樣直到找到最小的權值,就是乙個貪心思想,每次都是最小的和肯定是最小的。。

hdu 1879 prim

#include #include #include #include using namespace std;

#define m 1000

#define inf 100000000

int n;

int map[m][m];

int dis[m];

int used[m];

int sum;

void mst()

used[1] = 1;//標記1號點加入生成樹

for(int i = 2;i <= n;i++) //需要n-1條邊

/* 標記1號節點加入生成樹 */

mst[1] = 0;

/* n個節點至少需要n-1條邊構成最小生成樹 */

for (i = 2; i <= n; i++)

}/* 輸出生成樹邊的資訊:起點,終點,權值 */

printf("%c - %c : %d\n", mst[minid] + 'a' - 1, minid + 'a' - 1, min);

/* 累加權值 */

sum += min;

/* 標記節點minid加入生成樹 */

lowcost[minid] = 0;

/* 更新當前節點minid到其他節點的權值 */

for (j = 2; j <= n; j++)

}} /* 返回最小權值和 */

return sum;

}int main()

} /* 讀取邊資訊 */

for (k = 0; k < n; k++)

/* 求解最小生成樹 */

cost = prim(graph, m);

/* 輸出最小權值和 */

printf("total:%d\n", cost);

}

HDU 1879 最小生成樹

problem description 省 暢通工程 的目標是使全省任何兩個村莊間都可以實現公路交通 但不一定有直接的公路相連,只要能間接通過公路可達即可 現得到城鎮道路統計表,表中列出了任意兩城鎮間修建道路的費用,以及該道路是否已經修通的狀態。現請你編寫程式,計算出全省暢通需要的最低成本。inpu...

HDU 1879 繼續暢通工程 最小生成樹

省 暢通工程 的目標是使全省任何兩個村莊間都可以實現公路交通 但不一定有直接的公路相連,只要能間接通過公路可達即可 現得到城鎮道路統計表,表中列出了任意兩城鎮間修建道路的費用,以及該道路是否已經修通的狀態。現請你編寫程式,計算出全省暢通需要的最低成本。測試輸入包含若干測試用例。每個測試用例的第1行給...

HDU 1879 繼續暢通工程 最小生成樹

思路 比較典型的求最小生成樹,利用k演算法或者p演算法,如果在輸入時兩個村莊的修建狀態為 已修建,那麼我這裡的做法是讓他們之間的權值為 0,即修建費用為 0 然後套用演算法就好了。p演算法 1 include 2 include 3 include 4 include 5 include 6 inc...