hdu5253最小生成树
生活随笔
收集整理的這篇文章主要介紹了
hdu5253最小生成树
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:(中文題,直接粘過(guò)來(lái)吧)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?連接的管道
? ? 老 Jack 有一片農(nóng)田,以往幾年都是靠天吃飯的。但是今年老天格外的不開眼,大旱。所以老 Jack 決定用管道將他的所有相鄰的農(nóng)田全部都串聯(lián)起來(lái),這樣他就可以從遠(yuǎn)處引水過(guò)來(lái)進(jìn)行灌溉了。當(dāng)老 Jack 買完所有鋪設(shè)在每塊農(nóng)田內(nèi)部的管道的時(shí)候,老 Jack 遇到了新的難題,因?yàn)槊恳粔K農(nóng)田的地勢(shì)高度都不同,所以要想將兩塊農(nóng)田的管道鏈接,老 Jack 就需要額外再購(gòu)進(jìn)跟這兩塊農(nóng)田高度差相等長(zhǎng)度的管道。
? ? 現(xiàn)在給出老 Jack農(nóng)田的數(shù)據(jù),你需要告訴老 Jack 在保證所有農(nóng)田全部可連通灌溉的情況下,最少還需要再購(gòu)進(jìn)多長(zhǎng)的管道。另外,每塊農(nóng)田都是方形等大的,一塊農(nóng)田只能跟它上下左右四塊相鄰的農(nóng)田相連通。
?
Input
第一行輸入一個(gè)數(shù)字T(T≤10),代表輸入的樣例組數(shù)
輸入包含若干組測(cè)試數(shù)據(jù),處理到文件結(jié)束。每組測(cè)試數(shù)據(jù)占若干行,第一行兩個(gè)正整數(shù) N,M(1≤N,M≤1000),代表老 Jack 有N行*M列個(gè)農(nóng)田。接下來(lái) N 行,每行 M 個(gè)數(shù)字,代表每塊農(nóng)田的高度,農(nóng)田的高度不會(huì)超過(guò)100。數(shù)字之間用空格分隔。
Output
對(duì)于每組測(cè)試數(shù)據(jù)輸出兩行:
第一行輸出:"Case #i:"。i代表第i組測(cè)試數(shù)據(jù)。
第二行輸出 1 個(gè)正整數(shù),代表老 Jack 額外最少購(gòu)進(jìn)管道的長(zhǎng)度。
?
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:
82
Case #2:
74
思路:
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?連接的管道
? ? 老 Jack 有一片農(nóng)田,以往幾年都是靠天吃飯的。但是今年老天格外的不開眼,大旱。所以老 Jack 決定用管道將他的所有相鄰的農(nóng)田全部都串聯(lián)起來(lái),這樣他就可以從遠(yuǎn)處引水過(guò)來(lái)進(jìn)行灌溉了。當(dāng)老 Jack 買完所有鋪設(shè)在每塊農(nóng)田內(nèi)部的管道的時(shí)候,老 Jack 遇到了新的難題,因?yàn)槊恳粔K農(nóng)田的地勢(shì)高度都不同,所以要想將兩塊農(nóng)田的管道鏈接,老 Jack 就需要額外再購(gòu)進(jìn)跟這兩塊農(nóng)田高度差相等長(zhǎng)度的管道。
? ? 現(xiàn)在給出老 Jack農(nóng)田的數(shù)據(jù),你需要告訴老 Jack 在保證所有農(nóng)田全部可連通灌溉的情況下,最少還需要再購(gòu)進(jìn)多長(zhǎng)的管道。另外,每塊農(nóng)田都是方形等大的,一塊農(nóng)田只能跟它上下左右四塊相鄰的農(nóng)田相連通。
?
Input
第一行輸入一個(gè)數(shù)字T(T≤10),代表輸入的樣例組數(shù)
輸入包含若干組測(cè)試數(shù)據(jù),處理到文件結(jié)束。每組測(cè)試數(shù)據(jù)占若干行,第一行兩個(gè)正整數(shù) N,M(1≤N,M≤1000),代表老 Jack 有N行*M列個(gè)農(nóng)田。接下來(lái) N 行,每行 M 個(gè)數(shù)字,代表每塊農(nóng)田的高度,農(nóng)田的高度不會(huì)超過(guò)100。數(shù)字之間用空格分隔。
Output
對(duì)于每組測(cè)試數(shù)據(jù)輸出兩行:
第一行輸出:"Case #i:"。i代表第i組測(cè)試數(shù)據(jù)。
第二行輸出 1 個(gè)正整數(shù),代表老 Jack 額外最少購(gòu)進(jìn)管道的長(zhǎng)度。
?
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:
82
Case #2:
74
思路:
? ? ? 把所有點(diǎn)連接在一起的最下費(fèi)用,直接最小生成樹就行了,一共是1000*1000*2條邊,時(shí)間復(fù)雜度沒(méi)啥問(wèn)題,其實(shí)總感覺(jué)這個(gè)題目有點(diǎn)別扭,就是水流的方向問(wèn)題,感覺(jué)是最小樹形圖,哎!想多了。
#include<stdio.h> #include<string.h> #include<algorithm>#define N_node 1000*1000+10 #define N_edge 1000 * 1000 * 2 + 10using namespace std;typedef struct {int a ,b ,c; }EDGE;EDGE E[N_edge]; int map[1005][1005];bool camp(EDGE a ,EDGE b) {return a.c < b.c; }int mer[N_node];int finds(int x) {return x == mer[x] ? x : mer[x] = finds(mer[x]); }int abss(int x) {return x > 0 ? x : -x; }int main () {int t ,n ,m ,i ,j ,cas = 1;scanf("%d" ,&t);while(t--){scanf("%d %d" ,&n ,&m);for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= m ;j ++)scanf("%d" ,&map[i][j]);int nowid = 0;for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= m ;j ++){int now = (i - 1) * m + j;mer[now] = now;if(j < m){nowid ++;E[nowid].a = now;E[nowid].b = (i - 1) * m + j + 1;E[nowid].c = abss(map[i][j] - map[i][j+1]);}if(i < n){nowid ++;E[nowid].a = now;E[nowid].b = (i - 1 + 1) * m + j;E[nowid].c = abss(map[i][j] - map[i+1][j]);}}sort(E + 1 ,E + nowid + 1 ,camp);int sum = 0;for(i = 1 ;i <= nowid ;i ++){int a = finds(E[i].a);int b = finds(E[i].b);if(a != b){mer[a] = b;sum += E[i].c;}}printf("Case #%d:\n" ,cas ++);printf("%d\n" ,sum);}return 0; }
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的hdu5253最小生成树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hdu5251最小矩形覆盖
- 下一篇: hdu5256序列变换(非递减子序列)