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

2021-08-21 19:21:12 字數 1556 閱讀 3228

題目:

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

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

input

第一行輸入乙個數字t(t≤10)t(t≤10),代表輸入的樣例組數 

輸入包含若干組測試資料,處理到檔案結束。每組測試資料佔若干行,第一行兩個正整數 n,m(1≤n,m≤1000)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

分析:要將題目中給的數值轉換成彼此想連的點,這塊轉換有點麻煩,剩下的步驟用krustral就可以了 。另,該題不需要判斷是否邊數,因為如果兩片地如果一樣高有可能其中一片就不需要用高度連線。所以krustral需要簡化一下。不能只抄模板。

#include #include #include #include #include #define maxn 1005

using namespace std;

struct edge

edge[maxn*maxn*2];

int pre[maxn*maxn];

int tol;

int n,m;

void addedge(int u,int v,int w)

bool cmp(edge a,edge b)

int find(int x)

return r;

}int kustral()

}return ans;

}int cost[maxn][maxn];

int main()

for(int i=0;ifor(int j=0;jpre[i*m+j]=i*m+j;

int ans=kustral();

printf("case #%d:\n%d\n",++l,ans);

}return 0;

}

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

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

最小生成樹 連線格點

有乙個 mm 行 nn 列的點陣,相鄰兩點可以相連。一條縱向的連線花費乙個單位,一條橫向的連線花費兩個單位。某些點之間已經有連線了,試問至少還需要花費多少個單位才能使所有的點全部連通。輸入格式第一行輸入兩個正整數 mm 和 nn 以下若干行每行四個正整數 x1,y1,x2,y2x1,y1,x2,y2...

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...