Farm Irrigation HDU - 1198 (並查集)
阿新 • • 發佈:2017-09-07
i++ 灌溉 pan isp hdu color img 二進制表示 clu
Farm Irrigation
HDU - 1198
題意:給11種管道,問草地最少需要打多少個井才可以全部灌溉。
把每種管道的狀態用二進制表示一下,然後對每一塊草地,判斷能否和上面或者左面的草地的管道連接。
然後並查集搞一下。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=55; 4 5 int g[12]={10,9,6,5,12,3,11,14,7,13,15}; 6 int f[maxn*maxn]; 7 char p[maxn][maxn]; 8 int n,m;View Code9 10 int gf(int x){ 11 return x==f[x]?f[x]:f[x]=gf(f[x]); 12 } 13 void uni(int a,int b){ 14 int pa=gf(a),pb=gf(b); 15 f[pa]=pb; 16 } 17 void check(int i,int j){ 18 int id=i*m+j; 19 if(i>0&&((g[p[i][j]-‘A‘]>>3)&1)&&((g[p[i-1][j]-‘A‘]>>2)&1)) {20 uni(id,id-m); 21 } 22 if(j>0&&((g[p[i][j]-‘A‘]>>1)&1)&&((g[p[i][j-1]-‘A‘])&1)) { 23 uni(id,id-1); 24 } 25 return ; 26 } 27 28 int main(){ 29 // freopen("in.txt","r",stdin); 30 while(scanf("%d%d",&n,&m)&&(n!=-1&&m!=-1)){ 31 for(int i=0;i<n;i++){ 32 scanf("%s",p[i]); 33 for(int j=0;j<m;j++){ 34 int id=i*m+j; 35 f[id]=id; 36 } 37 } 38 for(int i=0;i<n;i++){ 39 for(int j=0;j<m;j++){ 40 check(i,j); 41 } 42 } 43 n=n*m; 44 int cnt=0; 45 for(int i=0;i<n;i++) if(gf(i)==i) cnt++; 46 printf("%d\n",cnt); 47 } 48 return 0; 49 }
Farm Irrigation HDU - 1198 (並查集)