題目:
老 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
2sample output4 3
9 12 4
7 8 56
32 32 43
21 12 12
2 3
34 56 56
12 23 4
case #1:分析:要將題目中給的數值轉換成彼此想連的點,這塊轉換有點麻煩,剩下的步驟用krustral就可以了 。另,該題不需要判斷是否邊數,因為如果兩片地如果一樣高有可能其中一片就不需要用高度連線。所以krustral需要簡化一下。不能只抄模板。82case #2:
74
#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的生成樹,而各邊權和最小的生成樹則被稱...