码迷,mamicode.com
首页 > 其他好文 > 详细

查找细胞(三)-并查集

时间:2016-06-13 06:32:47      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:

把相连的格子放入同一个集合,统计集合的个数即可

 

#include<stdio.h>

const int MAXN = 40000; /*结点数目上限*/
int pa[MAXN];    /*p[x]表示x的父节点*/
int rank[MAXN];    /*rank[x]是x的高度的一个上界*/

int find(int x)
{
  /*带路径压缩的查找*/
  if(x != pa[x])
    pa[x] = find(pa[x]);
  return pa[x];
}

/*按秩合并x,y所在的集合*/
void union_set(int x, int y)
{
  x = find(x);
  y = find(y);
  if(rank[x] > rank[y])/*让rank比较高的作为父结点*/
    pa[y] = x;
  else {
    pa[x] = y;
    if(rank[x] == rank[y])
      rank[y]++;
  }
}
int n, m;
int cell[200][200];

#define P(i,j) (i * m + j)

int main()
{
  int i, j, sum = 0;
  scanf("%d%d", &n, &m);
  for(i = 1; i <= n; i++)
    for(j = 1; j <= m; j++) {
      scanf("%1d", &cell[i][j]);
      if(cell[i][j]) {
        pa[P(i, j)] = P(i, j);
        if(cell[i - 1][j])
          union_set(P(i, j), P(i - 1, j));
        if(cell[i][j - 1])
          union_set(P(i, j), P(i, j - 1));
      }
    }
  for(i = 1; i <= n; i++) {
    for(j = 1; j <= m; j++) {
      if(cell[i][j]) {
        if(P(i, j) == find(P(i, j)))
          sum++;
      }
    }
  }
  printf("%d\n", sum);
  return 0;
}

/*
4 10
0234500067
1034560500
2045600671
0000000089
*/

 

查找细胞(三)-并查集

标签:

原文地址:http://www.cnblogs.com/4bytes/p/5579320.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!