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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

村村通工程(Prim算法)

發布時間:2024/5/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 村村通工程(Prim算法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

題目描述

思路分析

AC代碼


題目描述

"村村通"是國家一個系統工程,其包涵有:公路、電力、生活和飲用水、電話網、有線電視網、互聯網等等。

村村通公路工程,是國家為構建和諧社會,支持新農村建設的一項重大舉措,是一項民心工程。又稱“五年千億元”工程

該工程是指中國力爭在5年時間實現所有村莊通瀝青路或水泥路,以打破農村經濟發展的交通瓶頸,解決9億農民的出行難題。

現有村落間道路的統計數據表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。

要求用Prim算法求解

輸入

第1行:頂點數n

第2行:n個頂點編號

第3行:邊數m

接著m行:m條邊信息,格式為:頂點1 頂點2 權值

最后一行:Prim算法的起點v

輸出

第1行:輸出最小生成樹的權值之和

接著n-1行對應n-1條邊信息

按樹的生長順序輸出

輸入樣例1

6
v1 v2 v3 v4 v5 v6?
10
v1 v2 6
v1 v3 1
v1 v4 5
v2 v3 5
v2 v5 3
v3 v4 5
v3 v5 6
v3 v6 4
v4 v6 2
v5 v6 6
v1

輸出樣例1

15
v1 v3 1
v3 v6 4
v6 v4 2
v3 v2 5
v2 v5 3

思路分析

Prim算法的思想如下:

  • 選擇一個起始頂點作為初始集合,可以是任意一個頂點。
  • 將該起始頂點加入到最小生成樹的頂點集合中。
  • 從已加入最小生成樹的頂點集合中,選擇一個頂點u,將與頂點u相連且權值最小的邊(u, v)加入到候選邊集合。
  • 從候選邊集合中選擇權值最小的邊(u, v),將頂點v加入到最小生成樹的頂點集合中,同時將邊(u, v)加入到最小生成樹的邊集合中。
  • 重復步驟3和步驟4,直到最小生成樹包含圖中的所有頂點為止。
  • 通過這種方式,Prim算法逐漸擴展最小生成樹的頂點集合,保證每一步都選擇了與已加入頂點集合具有最小權值的邊。最終得到的最小生成樹是以起始頂點為根節點的一棵樹,并且總權值最小。

    需要注意的是,Prim算法的實現通常需要使用優先隊列(最小堆)來高效地選擇權值最小的邊。

    AC代碼

    #include<iostream> #include<vector>using namespace std; const int MaxLength = 100; struct Vertex {int index;string data; } vertex[MaxLength];struct Close {int adjacent;int cost = 0x3f3f3f3f; } close[MaxLength]; struct Path {int head;int tail; };class Map {int matrix[MaxLength][MaxLength] = {0};int vertexNumber;int sumCost = 0;vector<Path> path; public:Map() {cin >> vertexNumber;for (int i = 0; i < vertexNumber; i++) {cin >> vertex[i].data;vertex[i].index = i;}int edgeNumber;cin >> edgeNumber;for (int i = 0; i < edgeNumber; i++) {string tail, head;int cost;cin >> tail >> head >> cost;matrix[GetIndex(tail)][GetIndex(head)] = matrix[GetIndex(head)][GetIndex(tail)] = cost;}string start;cin >> start;Prim(GetIndex(start));}int GetIndex(string &data) {for (int i = 0; i < vertexNumber; i++)if (vertex[i].data == data)return i;}void Prim(int start) {for (int i = 0; i < vertexNumber; i++)if (matrix[start][i])close[i] = {start, matrix[start][i]};else close[i].adjacent = start;close[start].cost = 0;for (int i = 1; i < vertexNumber; i++) {int minCost = 0x3f3f3f3f, next;for (int j = 0; j < vertexNumber; j++)if (minCost > close[j].cost && close[j].cost) {minCost = close[j].cost;next = j;}close[next].cost = 0;Path pass = {close[next].adjacent, next};path.push_back(pass);sumCost += minCost;for (int j = 0; j < vertexNumber; j++)if (close[j].cost > matrix[next][j] && matrix[next][j])close[j] = {next, matrix[next][j]};}cout << sumCost << endl;for (auto &it: path)cout << vertex[it.head].data << ' ' << vertex[it.tail].data << ' ' << matrix[it.head][it.tail] << endl;} };int main() {Map test; }

    總結

    以上是生活随笔為你收集整理的村村通工程(Prim算法)的全部內容,希望文章能夠幫你解決所遇到的問題。

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