的乙個熱帶島嶼上的行政長官有乙個問題要解決。他決定把幾年前得到的外國援助資金用於修建村莊之間的道路。但是叢林比道路多太多了,使道路網路的維護太過於昂貴了。理事會必須選擇停止維修一些道路。上述左側圖顯示當前所有使用中的道路,以及現在每月的維護費用。當然,村莊之間必需有一些公路能夠相通,即使路線並不像以前一樣短。行政長官想告訴理事會怎樣才使每月的花費最小,並且所維持的道路,將連線所有村莊。上面的地圖標記了村莊a到
i。右邊的圖顯示了每月能夠維護道路的最小費用為
216aacms
。你的任務是編寫乙個程式,將解決這些問題。
輸入:輸入包含的資料集個數在
100以內,以
0作為最後一行。每個資料集的第一行只包含乙個表示村莊個數的數n,
1,並且這
n個村莊是由大寫字母表裡的前
n個字母表示。接下來的
n- 1
行是由字母表的前
n-1個字母開頭。最後乙個村莊表示的字母不用輸入。對於每一行,以每個村莊表示的字母開頭,然後後面跟著乙個數字,表示有多少條道路可以從這個村到後面字母表中的村莊。如果
k是大於
0,表示該行後面會表示
k條道路的
k個資料。每條道路的資料是由表示連線到另一端村莊的字母和每月維修該道路的花費組成。維修費用是正整數的並且小於
100。該行的所有資料字段分隔單一空白。該公路網將始終連線所有的村莊。該公路網將永遠不會超過
75條道路。沒有任何乙個村莊會有超過
15條的道路連線到其他村莊(之前或之後的字母)。
在下面的示例輸入,其中第乙個資料集是與上面的地圖相一致的。
sample input 9
a 2 b 12 i 25
b 3 c 10 h 40 i 8
c 2 d 18 g 55
d 1 e 44
e 2 f 60 g 38
f 0g 1 h 35
h 1 i 35
3a 2 b 10 c 40
b 1 c 20
0sample output
21630主要是怎麼去最小生成樹;這裡用的是克魯斯卡爾演算法;
#include #include #define num 30
using namespace std;
int n;//表示村莊數;
int graph[num][num];
int k_road()
}//構造圖成功;
// for(int i = 1;i<=n;i++)minside[num];
int min_xu()
return k;
}int pu_g()
}return min_totle_value;
}int main()
}//構造圖成功;
// for(int i = 1;i<=n;i++){
// for(int j = 1;j<=n;j++)
// cout <
最小生成樹演算法
由帶權的連通圖生成的數的各邊加起來稱為生成樹的權,把權值最小的生成樹稱為最小生成樹 minimum spanning tree 簡稱為mst 構造最小生成樹的方法就是利用mst性質,一條一條地選擇可以加入的邊。下面介紹兩種用於構造最小生成樹的演算法,其中第一種演算法稱為prim演算法,第二種演算法稱...
最小生成樹演算法
乙個最簡單的最小生成樹 圖結構練習 最小生成樹 time limit 1000ms memory limit 65536k 有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。輸...
演算法 最小生成樹
前言 最小生成樹是在乙個給定的無向圖中求一棵樹,這棵樹包含無向圖中的所有頂點,且樹中的邊都來自無向圖中的邊,並且要滿足整棵樹的邊權之和最小。1 最小生成樹是樹,其邊數等於頂點數減1,且不會有環 2 對於給定的圖最小生成樹可以不唯一,但是邊權之和一定是唯一的。3 其根節點可以是這棵樹上的任何乙個節點,...