HDOJ 5253 連線的管道(最小生成樹)

2021-07-22 06:28:34 字數 1583 閱讀 2254

problem description

老 jack 有一片農田,以往幾年都是靠天吃飯的。但是今年老天格外的不開眼,大旱。所以老 jack 決定用管道將他的所有相鄰的農田全部都串聯起來,這樣他就可以從遠處引水過來進行灌溉了。當老 jack 買完所有鋪設在每塊農田內部的管道的時候,老 jack 遇到了新的難題,因為每一塊農田的地勢高度都不同,所以要想將兩塊農田的管道鏈結,老 jack 就需要額外再購進跟這兩塊農田高度差相等長度的管道。

現在給出老 jack農田的資料,你需要告訴老 jack 在保證所有農田全部可連通灌溉的情況下,最少還需要再購進多長的管道。另外,每塊農田都是方形等大的,一塊農田只能跟它上下左右四塊相鄰的農田相連通。

input

第一行輸入乙個數字 t

(t≤10

) ,代表輸入的樣例組數

輸入包含若干組測試資料,處理到檔案結束。每組測試資料佔若干行,第一行兩個正整數  n

,m(1

≤n,m

≤1000

) ,代表老 jack 有n行*m列個農田。接下來 n 行,每行 m 個數字,代表每塊農田的高度,農田的高度不會超過100。數字之間用空格分隔。

output

對於每組測試資料輸出兩行:

第一行輸出:"case #i:"。i代表第i組測試資料。

第二行輸出 1 個正整數,代表老 jack 額外最少購進管道的長度。

sample input

2

4 3

9 12 4

7 8 56

32 32 43

21 12 12

2 3

34 56 56

12 23 4

sample output

case #1:

82case #2:

74

解題思路:建圖 + kruskal演算法,注意連邊時的處理。

**如下:

#include const int maxn = 2005;

const int maxm = 2000005;

struct edge

;edge edges[maxm];

int par[maxm];

int mp[maxn][maxn];

int dir[4][2] = ,,,};

int n,m,e;

void init(int n)

int find(int x)

void unite(int x,int y)

void add_edge(int from,int to,int dis)

bool same(int x,int y)

bool cmp(edge a,edge b)

int kruskal()

return res;

}int main()

} printf("case #%d:\n%d\n",++ncase,kruskal());

} return 0;

}

HDU 5253 連線的管道

題目連線 老 jack 有一片農田,以往幾年都是靠天吃飯的。但是今年老天格外的不開眼,大旱。所以老 jack 決定用管道將他的所有相鄰的農田全部都串聯起來,這樣他就可以從遠處引水過來進行灌溉了。當老 jack 買完所有鋪設在每塊農田內部的管道的時候,老 jack 遇到了新的難題,因為每一塊農田的地勢...

hdu 5253連線的管道

傳送門 題意 農夫連線農田,每塊農田的相對高度差是建圖的權值。最小生成樹的入門模版題,不錯不錯 include include include using namespace std const int maxn 1010 int fa 5000005 int maze maxn maxn int ...

HDU5253 連線的管道

problem description 老 jack 有一片農田,以往幾年都是靠天吃飯的。但是今年老天格外的不開眼,大旱。所以老 jack 決定用管道將他的所有相鄰的農田全部都串聯起來,這樣他就可以從遠處引水過來進行灌溉了。當老 jack 買完所有鋪設在每塊農田內部的管道的時候,老 jack 遇到了...