這題好詭異,用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...