村村通工程(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算法的思想如下:
通過這種方式,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算法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向大规模图像检索的层次语义索引
- 下一篇: Viso删除参考线,删除形状,删除连接点