Farm Irrigation HDU - 1198 (并查集)
Farm Irrigation
题意:给11种管道,问草地最少需要打多少个井才可以全部灌溉。
把每种管道的状态用二进制表示一下,然后对每一块草地,判断能否和上面或者左面的草地的管道连接。
然后并查集搞一下。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; 9 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 }