還是暢通工程 九度 OJ 1017

2021-09-12 17:37:35 字數 1015 閱讀 1134

在給定的道路中選取一些,使所有的城市直接或間接連通且使道路的總長度最小,該例即為典型的最小生成樹問題。將城市抽象成圖上的結點,將道路抽象成連線點的邊,其長度即為邊的權值。經過這樣的抽象,求得該圖的最小生成樹,其上所有的邊權和即為所求。

最小生成樹kruskal演算法按如下步驟求解最小生成樹:

1.初始時所有結點屬於孤立的集合。

2.按照邊權遞增順序遍歷所有的邊,若遍歷到的邊兩個頂點仍分屬不同的集合(該邊即為連通這兩個集合的邊中權值最小的那條)則確定該邊為最小生成樹上的一條邊,並將這兩個頂點分屬的集合合併。

3.遍歷完所有邊後,原圖上所有結點屬於同乙個集合則被選取的邊和原圖中所有結點構成最小生成樹;否則原圖不連通,最小生成樹不存在。

如步驟所示,在用kruskal演算法求解最小生成樹的過程中涉及到大量的集合操作,可以使用並查集來實現這些操作。

#include #include #define n 101

using namespace std;

int tree[n];

int findroot(int x)

}struct edge

}edge[6000];

int main()

sort(edge+1,edge+1+n*(n-1)/2);

//按照邊權值遞增排列所有的邊

for(int i=1;i<=n;i++)

int ans=0;//最小生成樹上邊權的和,初始值為0

for(int i=1;i<=n*(n-1)/2;i++)

}printf("%d\n",ans);

}return 0;

}

如**所示,使用並查集處理結點的集合屬性,初始時所有結點屬於只包含其自身的孤立集合。依次遍歷按照邊權值遞增排列的邊時,若該邊的兩個頂點屬於兩個不同的集合,則合併這兩個集合同時將該邊的權值累加到答案中,直到遍歷完所有的邊。

該例不存在得不到最小生成樹的情況,所以最後並沒有對所有結點是否屬於同乙個集合進行判斷,若可能出現不存在最小生成樹的情況,則該步不能省略。

還是暢通工程 (九度 OJ 1017)

題目描述 某省調查鄉村交通狀況,得到的統計表中列出了任意兩村莊間的距離。省政 府 暢通工程的目標是使全省任何兩個村莊間都可以實現公路交通 但不一定有 直接的公路相連,只要間接通過公路可達即可 並要求鋪設的公路總長度為最 小。請計算最小的公路總長度。輸入 測試輸入包含若干測試用例。每個測試用例的第 1...

九度 1012 暢通工程

題目描述 某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省 暢通工程 的目標是使全省任何兩個城鎮間都可以實現交通 但不一定有直接的道路相連,只要互相間接通過道路可達即可 問最少還需要建設多少條道路?輸入測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分...

九度 題目1012 暢通工程

這題我是以連通域來做的,n個點至少需要n 1個邊才能連通。如果形成迴路,則相當於有這條邊浪費了,沒有任何價值。最終至少還需要多少邊才能把所有的城鎮聯通,也就是求剩下的孤立的點和連通域之間還需要幾條邊才能連通!比如 最後利用程式求得3個連通域和2個孤立的點,那麼至少需要3 2 1 5條邊才能全部連通 ...