Farm Irrigation HDU - 1198 (并查集)

Posted yijiull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于Farm Irrigation HDU - 1198 (并查集)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2412 Farm Irrigation

hdu 1198 Farm Irrigation(深搜dfs || 并查集)

HDU 1198 Farm Irrigation(并查集+位运算)

HDU--1198 Farm Irrigation (并查集做法+DFS做法)

HDU 1198 Farm Irrigation(并查集,自己构造连通条件)

Farm Irrigation HDU - 1198 (并查集)