(水题)并查集求连通块hdu1198
2018-04-02 22:13
162 查看
#include <cstdio>
#include <cstring>
using namespace std;
bool grad[11][4] = {{1,1,0,0}, {1,0,0,1}, {0,1,1,0}, {0,0,1,1},//i = 0表示上,顺时针编号;j = 1表示连通
{1,0,1,0}, {0,1,0,1}, {1,1,0,1}, {1,1,1,0},
{0,1,1,1}, {1,0,1,1}, {1,1,1,1}};
char a[55][55];
int fa[55*55];
int pipe[55*55];
int m, n;
int findfa(int x);
void join(int x, int y, bool flag);//1则兼并右边,0则兼并下面
int main()
{
int i, j;
while(~scanf("%d %d", &m, &n), ~m && ~n)
{
getchar();
for(i = 0; i < m * n; ++i) fa[i] = i;
for(i = 0; i < m; ++i) scanf("%s", a[i]);
getchar();
for(i = 0; i < m; ++i)
for(j = 0; j < n; ++j)
pipe[i * n + j] = a[i][j] - 'A';
for(i = 0; i < m; ++i)
for(j = 0; j < n; ++j)
{
if(j < n - 1) join(i * n + j, i * n + j + 1, 1);
if(i < m - 1) join(i * n + j, (i + 1) * n + j, 0);
}
int cnt = 0;
for(i = 0; i < m * n; ++i)
if(fa[i] == i) ++cnt;
printf("%d\n", cnt);
}
return 0;
}
void join(int x, int y, bool flag)
{
int px = pipe[x], py = pipe[y];
int f1 = findfa(x);
int f2 = findfa(y);
if(flag && grad[px][3] && grad[py][1]) fa[f2] = f1;
if(!flag && grad[px][2] && grad[py][0]) fa[f2] = f1;
}
int findfa(int x)
{
return fa[x] == x ? x : fa[x] = findfa(fa[x]);
}
#include <cstring>
using namespace std;
bool grad[11][4] = {{1,1,0,0}, {1,0,0,1}, {0,1,1,0}, {0,0,1,1},//i = 0表示上,顺时针编号;j = 1表示连通
{1,0,1,0}, {0,1,0,1}, {1,1,0,1}, {1,1,1,0},
{0,1,1,1}, {1,0,1,1}, {1,1,1,1}};
char a[55][55];
int fa[55*55];
int pipe[55*55];
int m, n;
int findfa(int x);
void join(int x, int y, bool flag);//1则兼并右边,0则兼并下面
int main()
{
int i, j;
while(~scanf("%d %d", &m, &n), ~m && ~n)
{
getchar();
for(i = 0; i < m * n; ++i) fa[i] = i;
for(i = 0; i < m; ++i) scanf("%s", a[i]);
getchar();
for(i = 0; i < m; ++i)
for(j = 0; j < n; ++j)
pipe[i * n + j] = a[i][j] - 'A';
for(i = 0; i < m; ++i)
for(j = 0; j < n; ++j)
{
if(j < n - 1) join(i * n + j, i * n + j + 1, 1);
if(i < m - 1) join(i * n + j, (i + 1) * n + j, 0);
}
int cnt = 0;
for(i = 0; i < m * n; ++i)
if(fa[i] == i) ++cnt;
printf("%d\n", cnt);
}
return 0;
}
void join(int x, int y, bool flag)
{
int px = pipe[x], py = pipe[y];
int f1 = findfa(x);
int f2 = findfa(y);
if(flag && grad[px][3] && grad[py][1]) fa[f2] = f1;
if(!flag && grad[px][2] && grad[py][0]) fa[f2] = f1;
}
int findfa(int x)
{
return fa[x] == x ? x : fa[x] = findfa(fa[x]);
}
相关文章推荐
- 【倒跑并查集维护连通块】NCPC 2016 A. Artwork
- 蒟蒻对并查集的实际应用2:求无向图最大连通块结点数
- luogu1396 二分答案或者并查集水题
- POJ2524 并查集水题
- 修复公路 洛谷1111 并查集 水题
- HDU 4496 D-City (并查集,水题)
- HDU 1232 畅通工程 (并查集找连通块)
- 湖南科技大学 问题 B: 并查集_无线网络 水题
- 杭电 1232 并查集水题 畅通工程
- hdu1198 并查集
- C. PolandBall and Forest----并查集水题
- hdu1198(并查集)
- NOJ 1798 并查集水题
- POJ - 2386 Lake Counting(DFS连通块水题)
- 修复公路 洛谷1111 并查集 水题
- HDOJ1856 并查集水题
- hdu1198(并查集)
- 并查集的几道题(hdu1198)(1232)(1272)(1598)
- poj 1213 How Many Tables 并查集水题
- POJ 1988 Cube Stacking(并查集+求距离+连通块中元素个数)