日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 1233 最小生成树

發布時間:2023/12/18 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 1233 最小生成树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • /***********************************************************************************************************************
  • map 存路徑,值為權值; weight保存個點到源起點的權值; pre保存結點的前驅,即與源起點有路的下一個點
  • length 生成的最短距離 point 圖上共有多少點 sign該點是否已經找過
  • 算法prim:
  • 從一個結點的子圖開始構造生成樹:選擇連接當前子圖和子圖外結點的最小權邊,將相應結點和邊加入子圖,直至將所有結點加入子圖
  • ***********************************************************************************************************************/
  • #include <stdio.h>
  • #include <string>
  • #define SIZE 1100
  • #define INF 0x7fffffff
  • int 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
  • 某省調查鄉村交通狀況,得到的統計表中列出了任意兩村莊間的距離。省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可),并要求鋪設的公路總長度為最小。請計算最小的公路總長度。
  • Input
  • 測試輸入包含若干測試用例。每個測試用例的第1行給出村莊數目N ( < 100 );隨后的N(N-1)/2行對應村莊間的距離,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間的距離。為簡單起見,村莊從1到N編號。
  • 當N為0時,輸入結束,該用例不被處理。
  • Output
  • 對每個測試用例,在1行里輸出最小的公路總長度。
  • Sample Input
  • 3
  • 1 2 1
  • 1 3 2
  • 2 3 4
  • 4
  • 1 2 1
  • 1 3 4
  • 1 4 1
  • 2 3 3
  • 2 4 2
  • 3 4 5
  • 0
  • Sample Output
  • 3
  • 5
  • */



  • 來自為知筆記(Wiz)

    附件列表

    ?

    轉載于:https://www.cnblogs.com/sober-reflection/p/5e68cd23427f47403e83f66013d4f7b7.html

    總結

    以上是生活随笔為你收集整理的hdu 1233 最小生成树的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。