現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。
輸入資料報括城鎮數目正整數n(≤1000)和候選道路數目m(≤3n);隨後的m行對應m條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。為簡單起見,城鎮從1到n編號。
輸出村村通需要的最低成本。如果輸入資料不足以保證暢通,則輸出−1,表示需要建設更多公路。
6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3
12
這題採用prim演算法或者kruskal演算法,但是kruskal演算法需要進行寫乙個並查集進行判斷連通性,所以選擇prim演算法進行寫。
#include #include #include #define inf 999999
using namespace std;
int n, m, a, b, c;
int e[1010][1010] = , dist[1010], vis[1010] = ;
priority_queue, vector>, greater>> q;
int main()
fill(dist, dist + 1010, inf);
dist[1] = 0;
q.push();
while(q.size()) );}}
}int sum = 0, conn = 1;
for(int i = 1; i <= n; i++)
if(!conn) printf("-1\n");
else printf("%d\n", sum);
return 0;
}
#include #include #include #define inf 999999
using namespace std;
int n, m, a, b, c;
int vis[1010] = ;
priority_queue, vector>, greater>> q;
int main() );
}int sum = 0, conn = 1;
while(q.size())
q.pop();
}printf("%d\n", sum);
return 0;
}
最小生成樹 Prim演算法和Kruskal演算法
最小生成樹 3條構造最小生成樹的準則 只能使用該網路中的邊來構造最小生成樹 只能使用恰好n 1條邊來聯結網路中的n個結點 選用的這個n 1條邊不能構成迴路。mst性質 假設n v,是乙個連通網,u是頂點集合v的乙個非空子集。若 u,v 是一條具有最小值 代價 的邊,其中u屬於u,v屬於v u 即u對...
最小生成樹 Prim演算法和Kruskal演算法
轉於 prim演算法 設圖g v,e 其生成樹的頂點集合為u。把v0放入u。在所有u u,v v u的邊 u,v e中找一條最小權值的邊,加入生成樹。把 找到的邊的v加入u集合。如果u集合已有n個元素,則結束,否則繼續執行 其演算法的時間複雜度為o n 2 define maxn boolflag ...
最小生成樹 Prim演算法和Kruskal演算法
prim演算法 演算法簡單描述 1 輸入 乙個加權連通圖,其中頂點集合為v,邊集合為e 2 初始化 vnew 其中x為集合v中的任一節點 起始點 enew 為空 3 重複下列操作,直到vnew v a.在集合e中選取權值最小的邊,其中u為集合vnew中的元素,而v不在vnew集合當中,並且v v 如...