公路村村通

2021-10-01 05:57:47 字數 1984 閱讀 5115

現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。

輸入格式:

輸入資料報括城鎮數目正整數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輸入樣例:

6 10

1 2 6

1 3 1

1 4 5

2 3 5

2 5 3

3 4 5

3 5 6

3 6 4

5 6 6

4 6 2

輸出樣例:

15解題思路

*用prim演算法生成最小生成樹,各路徑的權值相加。需要注意的幾點及我的演算法中可能可以改進的地方

1,輔助陣列初始化的時候,如果初始結點與其他結點沒有邊,應該把邊的權值設定成機器大數。

2,可以利用最小生成樹的邊是頂點數減一(e=v-1)這樣的性質判斷圖是否聯通。或者加入聯通集合中的頂點數是否等於頂點總數來判斷圖的聯通情況。我在以下的**中單獨做了乙個判斷聯通的函式,這對於做題來說有點浪費算力。

**

***********

#include

#include

#include

#include

#include

using std::cin;

using std::cout;

using std::endl;

class graph

int locatevertex(int u)

;~closedge()

int minimum()

;int minispantree(graph &g);

void text(closedge &c);

int main()

std::istream &operator>>(std::istream &is,graph &g)

return is;

}

return total;

}

bool graph::connected()

{int acount=0,k;

std::queue q;

int visited=new int[vexnum];

memset(visited,0,vexnumsizeof(int));

q.push(vertex[0]);//首結點入隊

visited[0]=1;//設定訪問標記

while(!q.empty())

{k=locatevertex(q.front());

for(int i=0;i6 10

1 3 3

1 4 7

1 5 4

1 6 2

3 4 6

3 5 1

3 6 1

4 5 10

4 6 8

5 6 3

6 10

1 2 6

1 3 1

1 4 5

2 3 5

2 5 3

3 4 5

3 5 6

3 6 4

5 6 6

4 6 2

公路村村通

公路村村通 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個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。為簡單起見...