Farm Irrigation HDU - 1198 (并查集)

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

 

posted @ 2017-09-06 23:17  yijiull  阅读(115)  评论(0编辑  收藏  举报