标签:
http://acm.hdu.edu.cn/showproblem.php?pid=5253
老 Jack 有一片农田,以往几年都是靠天吃饭的。但是今年老天格外的不开眼,大旱。所以老 Jack 决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过来进行灌溉了。当老 Jack 买完所有铺设在每块农田内部的管道的时候,老 Jack 遇到了新的难题,因为每一块农田的地势高度都不同,所以要想将两块农田的管道链接,老 Jack 就需要额外再购进跟这两块农田高度差相等长度的管道。
现在给出老 Jack农田的数据,你需要告诉老 Jack 在保证所有农田全部可连通灌溉的情况下,最少还需要再购进多长的管道。另外,每块农田都是方形等大的,一块农田只能跟它上下左右四块相邻的农田相连通。
第一行输入一个数字$T\ (T \leq 10)$,代表输入的样例组数
输入包含若干组测试数据,处理到文件结束。每组测试数据占若干行,第一行两个正整数 $N,M(1 \leq N,M \leq 1000)$,代表老 Jack 有N行*M列个农田。接下来 N 行,每行 M 个数字,代表每块农田的高度,农田的高度不会超过100。数字之间用空格分隔。
对于每组测试数据输出两行:
第一行输出:"Case #i:"。i代表第i组测试数据。
第二行输出 1 个正整数,代表老 Jack 额外最少购进管道的长度。
2
4 3
9 12 4
7 8 56
32 32 43
21 12 12
2 3
34 56 56
12 23 4
Case #1:
82
Case #2:
74
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<vector> #include<queue> #include<map> using std::map; using std::min; using std::sort; using std::pair; using std::vector; using std::multimap; using std::priority_queue; #define pb(e) push_back(e) #define sz(c) (int)(c).size() #define mp(a, b) make_pair(a, b) #define all(c) (c).begin(), (c).end() #define iter(c) __typeof((c).begin()) #define cls(arr, val) memset(arr, val, sizeof(arr)) #define cpresent(c, e) (find(all(c), (e)) != (c).end()) #define rep(i, n) for(int i = 0; i < (int)n; i++) #define tr(c, i) for(iter(c) i = (c).begin(); i != (c).end(); ++i) const int N = 1100; const int INF = 0x3f3f3f3f; struct edge { int u, v, w; inline bool operator<(const edge &e) const { return w < e.w; } }G[(N * N) << 1]; int H, W, E, X[N][N], par[N * N], rank[N * N]; namespace work { inline int find(int x) { while(x != par[x]) { x = par[x] = par[par[x]]; } return x; } inline bool unite(int x, int y) { x = find(x), y = find(y); if(x == y) return false; if(rank[x] < rank[y]) { par[x] = y; } else { par[y] = x; rank[x] += rank[x] == rank[y]; } return true; } inline int kruskal() { sort(G, G + E); int res = 0; rep(i, E) { edge &e = G[i]; if(unite(e.u, e.v)) { res += e.w; } } return res; } inline void init() { E = 0; rep(i, H) { rep(j, W) { scanf("%d", &X[i][j]); int v = i * W + j; par[v] = v, rank[v] = 0; if(i) { G[E++] = (edge){ v, v - W, abs(X[i][j] - X[i - 1][j]) }; } if(j) { G[E++] = (edge){ v, v - 1, abs(X[i][j] - X[i][j - 1]) }; } } } } }; int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w+", stdout); #endif int t, v, k = 1; scanf("%d", &t); while(t--) { scanf("%d %d", &H, &W); work::init(); v = work::kruskal(); printf("Case #%d:\n%d\n", k++, v); } return 0; }
标签:
原文地址:http://www.cnblogs.com/GadyPu/p/4796228.html