1. 程式人生 > >Farm Irrigation HDU - 1198 (並查集)

Farm Irrigation HDU - 1198 (並查集)

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;
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

Farm Irrigation HDU - 1198 (並查集)