暑假集训中期测试 Problem D: 装箱问题2 (并查集)
生活随笔
收集整理的這篇文章主要介紹了
暑假集训中期测试 Problem D: 装箱问题2 (并查集)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Description
有很多個(gè)棱長(zhǎng)為1的正方體貨物整齊地堆在一堆。不過有一些是懸空的, 大概是粘上去的吧。。。
給出這些貨物的相鄰關(guān)系,求最小的長(zhǎng)方體(或正方體)能裝下這些貨物的集裝箱的體積,(集裝箱棱長(zhǎng)方向與這些正方體三個(gè)棱方向平行)。
Input
每組數(shù)據(jù)第一行一個(gè)n,表示有n個(gè)貨物。1 <= n <= 1000
接下來n行每行6個(gè)數(shù),第i行表示以棱方向?yàn)檩S的x軸正負(fù)、y軸正負(fù)、z軸正負(fù)方向與第i個(gè)貨物相鄰的貨物編號(hào)(i為1~n),0表示無該位置信息。
Output
如果描述出現(xiàn)矛盾或者無法確定貨物是堆在一起的,輸出"What?",否則輸出集裝箱體積。
Sample Input
3 0 0 0 0 3 2 0 0 0 0 1 0 0 0 0 0 0 1Sample Output
3 ? View Code #include <stdio.h> #define N 1005 #define MIN(a,b) ((a)<(b)?(a):(b)) #define MAX(a,b) ((a)>(b)?(a):(b)) #define INF 0x3fffffff int x[N],y[N],z[N]; int p[N]; int n; void make_set() {for(int i=1;i<=n;i++) p[i]=i,x[i]=y[i]=z[i]=0; } int find_set(int i) {int pi=p[i];if(i^p[i]) p[i]=find_set(p[i]);if(pi^p[i]){x[i]+=x[pi];y[i]+=y[pi];z[i]+=z[pi];}return p[i]; } void union_set(int i,int j,int dir,int d) {int pi,pj;pi=find_set(i);pj=find_set(j);p[pj]=pi;//dir為0 表示 i與j在x方向上相鄰,d=1表示j在i右邊if(dir==0){x[pj]=x[i]-x[j]+d;y[pj]=y[i]-y[j];z[pj]=z[i]-z[j];}else if(dir==1){x[pj]=x[i]-x[j];y[pj]=y[i]-y[j]+d;z[pj]=z[i]-z[j];}else{x[pj]=x[i]-x[j];y[pj]=y[i]-y[j];z[pj]=z[i]-z[j]+d;} } int main() {int i,j;bool wa;while(~scanf("%d",&n)){make_set();wa=false;for(i=1;i<=n;i++){for(int dir=0;dir<3;dir++){for(int d=1;d>=-1;d-=2){scanf("%d",&j);if(j==0) continue;if(find_set(i)^find_set(j)) union_set(i,j,dir,d);else{if(dir==0 && !(y[i]==y[j]&&z[i]==z[j]&&d==x[j]-x[i])) wa=true;if(dir==1 && !(x[i]==x[j]&&z[i]==z[j]&&d==y[j]-y[i])) wa=true;if(dir==2 && !(y[i]==y[j]&&x[i]==x[j]&&d==z[j]-z[i])) wa=true;}}}}for(i=2;!wa && i<=n;i++) if(find_set(i)!=find_set(1)) wa=true;int minx=INF,maxx=-INF;int miny=INF,maxy=-INF;int minz=INF,maxz=-INF;if(wa) puts("What?");else{for(int i=1;i<=n;i++){minx=MIN(minx,x[i]); maxx=MAX(maxx,x[i]);miny=MIN(miny,y[i]); maxy=MAX(maxy,y[i]);minz=MIN(minz,z[i]); maxz=MAX(maxz,z[i]);}printf("%d\n",(maxx-minx+1)*(maxy-miny+1)*(maxz-minz+1));}}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/algorithms/archive/2012/07/30/2615633.html
總結(jié)
以上是生活随笔為你收集整理的暑假集训中期测试 Problem D: 装箱问题2 (并查集)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ-2400 Supervisor,
- 下一篇: LIBCMTD.lib与libcpmtd