hdu_5925_Coconuts(离散化+dfs)
题目链接:hdu_5925_Coconuts
题意:
给你一张很大的图,和小于200个的障碍点,问这张图中的联通块有多少个
题解:
由于障碍点只有200个,所以肯定有很多的空白部分,我们将这些空白部分 分成k个矩形来压缩,最终形成的压缩图就最大为400*400,然后dfs一下联通块就行了
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;i++) 3 using namespace std; 4 typedef long long ll; 5 6 const int N=407; 7 int t,ic=1,NN,C,n,edans,mp[N][N],x[N],y[N],X[N],Y[N],hs_x[N],hs_y[N],edx,edy,XX,YY,h[N],l[N]; 8 ll ans[N]; 9 10 void dfs(int i,int j) 11 { 12 ans[edans]+=1ll*h[i]*l[j],mp[i][j]=1; 13 if(i>1&&!mp[i-1][j])dfs(i-1,j); 14 if(i<XX&&!mp[i+1][j])dfs(i+1,j); 15 if(j>1&&!mp[i][j-1])dfs(i,j-1); 16 if(j<YY&&!mp[i][j+1])dfs(i,j+1); 17 } 18 19 int main() 20 { 21 scanf("%d",&t); 22 while(t--) 23 { 24 scanf("%d%d%d",&NN,&C,&n); 25 F(i,1,n)scanf("%d%d",x+i,y+i),hs_x[i]=x[i],hs_y[i]=y[i]; 26 hs_x[n+1]=0,hs_x[n+2]=NN+1,hs_y[n+1]=0,hs_y[n+2]=C+1; 27 edx=edy=n+2,XX=YY=0,edans=0; 28 sort(hs_x+1,hs_x+1+edx),edx=unique(hs_x+1,hs_x+1+edx)-hs_x-1; 29 sort(hs_y+1,hs_y+1+edy),edy=unique(hs_y+1,hs_y+1+edy)-hs_y-1; 30 F(i,2,edx) 31 { 32 if(hs_x[i]>hs_x[i-1]+1)h[++XX]=hs_x[i]-hs_x[i-1]-1; 33 if(i!=edx)h[++XX]=1; 34 F(j,1,n)if(x[j]==hs_x[i])X[j]=XX; 35 } 36 F(i,2,edy) 37 { 38 if(hs_y[i]>hs_y[i-1]+1)l[++YY]=hs_y[i]-hs_y[i-1]-1; 39 if(i!=edy)l[++YY]=1; 40 F(j,1,n)if(y[j]==hs_y[i])Y[j]=YY; 41 } 42 F(i,1,XX)F(j,1,YY)mp[i][j]=0; 43 F(i,1,n)mp[X[i]][Y[i]]=1; 44 F(i,1,XX)F(j,1,YY)if(!mp[i][j])ans[++edans]=0,dfs(i,j); 45 sort(ans+1,ans+1+edans); 46 printf("Case #%d:\n%d\n",ic++,edans); 47 F(i,1,edans)printf("%lld%c",ans[i]," \n"[i==edans]); 48 } 49 return 0; 50 }