7 10 公路村村通

2022-05-01 13:45:07 字數 3764 閱讀 2393

7-10 公路村村通(30 分)

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

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

思路:剛開始沒有打算使用dijkstra演算法,直接使用神奇的五行**,但是第四個測試點執行超時了;然後試了一下去掉

下面是超時的**:

#include#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 1001

intn, m, sum, map[maxn][maxn], flag[maxn][maxn];

bool empty_bfs(int

begin)

}return (cnt == n ? true : false);}

intmain()

if (!empty_bfs(1) || m1)

//核心**

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

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

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

memset(flag,

0, sizeof

(flag));

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

}for (int j = 1; j <= n; j++)

if (temp != 0

) }

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

將其變成無向圖

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

//核心**

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

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

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

int max = 0

;

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

尋找最大值將答案輸出

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

cout

<< max <

return0;

}

五行神奇**

#include#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 1001

intn, m, sum, map[maxn][maxn], dis[maxn][maxn], flag[maxn][maxn];

void dijkstra(int

begin)

flagg[temp] = 1

; cnt++;

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

if (!flagg[i] && map[temp][i] != 9999 && dis[begin][temp] + map[temp][i]

dis[begin][i] = dis[begin][temp] +map[temp][i];

}}bool empty_bfs(int

begin)

}return (cnt == n ? true : false);}

intmain()

if (!empty_bfs(1) || m1)

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

dijkstra(i);

memset(flag,

0, sizeof

(flag));

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

}map[j][temp] =dis[j][temp];

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

if (temp != 0

) }

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

將其變成無向圖

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

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

dijkstra(i);

int max = 0

;

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

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

if (dis[i][j] > max)max =dis[i][j];

cout

<< max <

return0;

}

dijkstra

學到了學到了,我居然一開始在用最短路徑的方法來做最小生成樹,要不是執行超時我都還不知道用prim演算法

7 10 公路村村通

通過的 以及注釋,注釋最多的地方,是思考的最多的地方 include include includeusing namespace std define n 1005 下次不要用n來命名,不然容易和下面的n弄混,unnecessarily int f n 樹的母節點,例如節點1的母節點f 1 2,那...

7 10 公路村村通

傳送門 題目描述 現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。輸入格式 輸入資料報括城鎮數目正整數n 1000 和候選道路數目m 3n 隨後的m行對應m條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道...

PAT 7 10 公路村村通

現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。輸入資料報括城鎮數目正整數n 1000 和候選道路數目m 3n 隨後的m行對應m條道路,每行給出3個正整數,分別是該條道路直接連通的兩個城鎮的編號以及該道路改建的預算成本。為簡單起見...