現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。
輸入資料報括城鎮數目正整數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,第一遍是莫名奇妙的bug,漏洞百出。。。。。
主要思路:這是一道關於最小生成樹(mst)的題目,主要利用貪心思想,每次選取最優頂點加入集合,直到所有頂點都加入。
首先要解決的圖是乙個無向網圖,有兩個集合,乙個是(裡面存放的是已經加入mst的頂點),另乙個集合是剩下沒有加入mst的頂點集合。 初始是有n個頂點,m條邊。選取編號1為源點。
lowcost[ i ] 頂點i距mst的最短路,lowcost[ i ]=0表示i已經加入了mst中
weight[ i ][ j ] 頂點i距j的距離
parent[ i ] i的父親節點,用於列印整棵樹。
1,首先從剩下節點的集合中每次選取距mst(即已經加入節點的集合)最少費用(lowcost)的那個頂點,這裡的距離一定是距整棵樹的最短距離,即樹中的每個節點到剩下節點的最短路。
2,每加入乙個新的頂點w後,都要檢視與該頂點相鄰的節點 j 的lowcost是否發生變化,即weight [w] [j],並且j是沒有加入mst中的。開始有點不太理解為啥更新lowcost而不是weight,因為整個過程就是在和lowcost打交道啊
3,重複步驟1,2。 正常情況下n-1次(因為不包括源點),特殊情況就是該圖不連通就直接跳出。
還有就是初始化的問題,這個問題開始時困擾了我蠻久,導致後面bug百出........
weight 開始時將與源點有直接邊的頂點置為邊的權重,其它置為正無窮。
lowcost用weight初始化(結果是源點的鄰接點的lowcost為直接邊的權重,其它為無窮大)並且一定要記得將lowcost[ 1 ]=0,
將源點的parent置為-1。
今天還學習到了無窮大0x3f3f3f3f,乙個好處就是它加上另乙個無窮大的值一般也不會溢位的。
先放乙個第一遍寫的漏洞百出的** 再和後面的作比較。
#include#define maxsize 1005
#define inf 99999990
using namespace std;
int dist[maxsize];/*某節點到最小生成樹的最短距離,
初始時把源點的鄰接點的dist置為w[s][i],不臨接為inf*/
int weight[maxsize][maxsize];
int parent[maxsize];
int n,m,sum,v,min_flag,cnt;
int c1,c2,d,s;
void prim();
void pre_deal();
int main()
printf("%d\n", prim());
return 0;
}int find_min()///尋找最小頂點
{ int mintemp=inf;
int v=0; ///巧妙之處啊啊啊,若圖不連通就返回0,否則就返回最小頂點。
for(int j = 1;j<= n;j++)///直接判斷lowcost一次。
{if(lowcost[j]&&lowcost[j]學習了一位大牛的**風格看起來也舒服多了啊。。。
公路村村通
公路村村通 kruscal 演算法 include include include using namespace std int per 1010 n,m struct node 結構體來儲存邊 x 5005 bool cmp node a,node b int find int x 並查集的查詢...
公路村村通
現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。輸入資料報括城鎮數目正整數 n 和候選道路數目 m 隨後的 m行對應 m條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。為簡單起見,城鎮從...
公路村村通
現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。輸入格式 輸入資料報括城鎮數目正整數n 1000 和候選道路數目m 3n 隨後的m行對應m條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。...