Hdu 1198 Farm Irrigation 基础并查集

来源:互联网 发布:下线代理赚钱软件 编辑:程序博客网 时间:2024/05/10 04:37

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198

题目大意:给你已知结构的方框土地,每块土地都有水渠通过,现在给你一块土地,让你判断需要几个供水点,其中相连的水渠只需要公用一个供水点。

解题思路:枚举每块地,如果有地和他相连,合并这两个点,最后统计有多少棵树,就需要多少个水源。

代码如下:

#include<cstdio>#include<cstring>int f[110*110],rank;  //因为 数组开小wrong两次,呜呜呜。。。char s[110][110];/*int find(int x) //并查集的另一种初始化,即都为-1,注意此时  return  的是x,而下面的写法return  f[x];{    if(f[x]==-1) return x;    return f[x]=find(f[x]);}*/int find(int x){    if(f[x]!=x) f[x]=find(f[x]);    return f[x];}void merge(int x,int y){    int fx=find(x);    int fy=find(y);    if(fx!=fy)        {            f[fx]=fy;            rank--;        }}int main(){    int m,n;    while(scanf("%d%d",&m,&n))    {        if(m<0||n<0) break;        rank=m*n;        for(int i=0;i<m;i++)            scanf("%s",&s[i]);        for(int i=0;i<m*n;i++)            f[i]=i;        for(int i=0;i<m;i++)            for(int j=0;j<n;j++)        {            if(i>0&&(s[i][j]=='A'||s[i][j]=='B'||s[i][j]=='E'||s[i][j]=='G'||s[i][j]=='H'||s[i][j]=='J'||s[i][j]=='K'))                if(s[i-1][j]=='C'||s[i-1][j]=='D'||s[i-1][j]=='E'||s[i-1][j]=='H'||s[i-1][j]=='I'||s[i-1][j]=='J'||s[i-1][j]=='K')                  merge(i*n+j,(i-1)*n+j);            if(j>0&&(s[i][j]=='A'||s[i][j]=='C'||s[i][j]=='F'||s[i][j]=='G'||s[i][j]=='H'||s[i][j]=='I'||s[i][j]=='K'))                if(s[i][j-1]=='B'||s[i][j-1]=='D'||s[i][j-1]=='F'||s[i][j-1]=='G'||s[i][j-1]=='I'||s[i][j-1]=='J'||s[i][j-1]=='K')                   merge(i*n+j,i*n+j-1);        }        printf("%d\n",rank);    }    return 0;}


 

0 0
原创粉丝点击