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 }
View Code

 

posted @ 2016-10-09 21:27  bin_gege  阅读(212)  评论(0编辑  收藏  举报