连接的管道
Time Limit: 20 Sec Memory Limit: 256 MB
题目连接
http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=601&pid=1002
Description
Input
第一行输入一个数字T(T≤10),代表输入的样例组数
输入包含若干组测试数据,处理到文件结束。每组测试数据占若干行,第一行两个正整数 N,M(1≤N,M≤1000),代表老 Jack 有N行*M列个农田。接下来 N 行,每行 M 个数字,代表每块农田的高度,农田的高度不会超过100。数字之间用空格分隔。
输入包含若干组测试数据,处理到文件结束。每组测试数据占若干行,第一行两个正整数 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: 82 Case #2: 74
HINT
题意
题解:
最小生成树,空间开大了,结果mle两发= =
代码:
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define test freopen("test.txt","r",stdin) #define maxn 2000001 #define mod 10007 #define eps 1e-9 int Num; char CH[20]; const int inf=0x3f3f3f3f; inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline void P(int x) { Num=0;if(!x){putchar('0');puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } //************************************************************************************** int u[maxn],v[maxn],w[maxn],r[maxn]; int g[1001][1001]; int pa[1000001],n,m; int nn,mm; bool cmp(int i,int j) { return w[i]<w[j]; } int fi(int x) { return pa[x]==x?x:pa[x]=fi(pa[x]); } int kruskal() { int ans=0; for(int i=0;i<n;i++) pa[i]=i; for(int i=0;i<m;i++) r[i]=i; sort(r,r+m,cmp); for(int i=0;i<m;i++) { int e=r[i]; int x=fi(u[e]); int y=fi(v[e]); if(x!=y) ans+=w[e],pa[x]=y; } return ans; } int main() { //test; int t=read(); for(int cas=1;cas<=t;cas++) { printf("Case #%d: ",cas); n=0,m=0; nn=read(),mm=read(); for(int i=1;i<=nn;i++) { for(int j=1;j<=mm;j++) { g[i][j]=read(); n++; } } for(int i=1;i<=nn;i++) { for(int j=1;j<=mm;j++) { pa[(i-1)*mm+(j-1)]=(i-1)*mm+(j-1); if(j!=mm) u[m]=(i-1)*mm+(j-1),v[m]=(i-1)*mm+(j),w[m++]=fabs(g[i][j]-g[i][j+1]); if(i!=nn) u[m]=(i-1)*mm+(j-1),v[m]=(i)*mm+(j-1),w[m++]=fabs(g[i][j]-g[i+1][j]); } } printf("%d ",kruskal()); } }