生活随笔
收集整理的這篇文章主要介紹了
hdu 1233 最小生成树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/***********************************************************************************************************************map 存路徑,值為權值; weight保存?zhèn)€點到源起點的權值; pre保存結點的前驅,即與源起點有路的下一個點length 生成的最短距離 point 圖上共有多少點 sign該點是否已經找過算法prim:從一個結點的子圖開始構造生成樹:選擇連接當前子圖和子圖外結點的最小權邊,將相應結點和邊加入子圖,直至將所有結點加入子圖***********************************************************************************************************************/#include <stdio.h>#include <string>#define SIZE 1100#define INF 0x7fffffffint map[1100][1100], weight[1100], pre[1100], length, point; bool sign[1100];void prim(int weight[],int map[][SIZE], int pre[], bool sign[], int &length, int point_num, int source){ //source源起點,一定要是路徑中有的 for(int i=1; i<=point_num; i++) //這里的路徑的標號都 > 1,記錄所以點到源起點的權值,前驅,將該點置為已經查找 { weight[i] = map[source][i]; pre[i] = source; sign[i] = true; } sign[source] = false; length = 0; for(int i=1; i<point_num; i++) //枚舉n-1個點,即n-1個通路 { int min = INF, sign_node = i; //sign_node 記錄找到的最小的下一個點 for(int j=1; j<=point_num; j++) //查找最小權值的路徑 { if(sign[j] && weight[j] < min) {min = weight[j]; sign_node = j;} } {sign[sign_node] = false; length += min; } //找到點置為已找到,長度相加, //可以在這里添加一個標記,使他值等于min,如果最后值等于最大值,則不能生成最小生成樹 for(int j=1; j<=point_num; j++) //重新設定源起點,將剩下的未找的點加入 { if(weight[j] > map[sign_node][j] && sign[j] ) {weight[j] = map[sign_node][j]; pre[j] = sign_node;} } }}void input(int n, int map[][SIZE]){ for(int i=1; i<=n ;i++) { int a, b, c; scanf("%d%d%d", &a, &b, &c); map[a][b] = c; map[b][a] = c; }}int main(){ int N; while(~scanf("%d", &N) && N ) { //scanf("%d", &M); //int map[1100][1100], weight[1100], pre[1100], length, point; //bool sign[1100]; for(int i=0; i<=N; i++) //初始化,N是端點個數 { weight[i] = INF; pre[N] = 0; for(int j=0; j<=N; j++) map[i][j] = INF; } memset(sign, false, sizeof(sign) ); length = point = 0; input( N*(N-1)/2, map); prim(weight, map, pre, sign, length, N, 1); //查找,注意這個1 它是源起點,一定要是在路徑上已知的點 printf("%d\n", length); } return 0;}/*Problem Description某省調查鄉(xiāng)村交通狀況,得到的統計表中列出了任意兩村莊間的距離。省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可),并要求鋪設的公路總長度為最小。請計算最小的公路總長度。 Input測試輸入包含若干測試用例。每個測試用例的第1行給出村莊數目N ( < 100 );隨后的N(N-1)/2行對應村莊間的距離,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間的距離。為簡單起見,村莊從1到N編號。當N為0時,輸入結束,該用例不被處理。 Output對每個測試用例,在1行里輸出最小的公路總長度。 Sample Input31 2 11 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50 Sample Output35*/ 來自為知筆記(Wiz)
附件列表
?
轉載于:https://www.cnblogs.com/sober-reflection/p/5e68cd23427f47403e83f66013d4f7b7.html
總結
以上是生活随笔為你收集整理的hdu 1233 最小生成树的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。