hdu 2952 dfs|bfs|union-find sets

dfs:

#include <iostream>
using namespace std;
short d[4][2] = {1,0,0,1,-1,0,0,-1};
char g[110][110];
int n, m, ans;

void dfs(int i, int j)
{
	g[i][j] = '.';
	for (int k=0;k<4;++k)
	{
		int x = i + d[k][0];
		int y = j + d[k][1];
		if (0<=x && x<n && 0<=y && y<m && g[x][y]=='#')
		dfs(x, y);
	}
}
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d %d\n", &n, &m);
		for (int i=0;i<n;++i)
		{
			for (int j=0;j<m;++j)
			scanf("%c", &g[i][j]);
			getchar();
		}
		ans = 0;
		for (int i=0;i<n;++i)
		for (int j=0;j<m;++j)
		if (g[i][j]=='#')
		{
			ans++;
			dfs(i, j);
		}
		printf("%d\n", ans);
	}
	return 0;
}

bfs:

#include <iostream>
#include <queue>
using namespace std;
short d[4][2] = {1,0,0,1,-1,0,0,-1};
struct N
{
	int x, y;
}o;
char g[110][110];
int n, m, ans;
queue <N> Q;

void bfs(int i, int j)
{
	N v = {i, j};
	Q.push(v);
	while (!Q.empty())
	{
		o = Q.front(), Q.pop();
		g[i = o.x][j = o.y] = '.';
		for (int k=0;k<4;++k)
		{
			int x = i + d[k][0];
			int y = j + d[k][1];
			if (0<=x && x<n && 0<=y && y<m && g[x][y]=='#')
			{
				g[x][y] = '.';
				N v = {x, y};
				Q.push(v);
			}
		}
	}
}

int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d %d\n", &n, &m);
		for (int i=0;i<n;++i)
		{
			for (int j=0;j<m;++j)
			scanf("%c", &g[i][j]);
			getchar();
		}
		ans = 0;
		for (int i=0;i<n;++i)
		for (int j=0;j<m;++j)
		if (g[i][j]=='#')
		{
			ans++;
			bfs(i, j);
		}
		printf("%d\n", ans);
	}
	return 0;
}
		

union find sets:

#include <iostream>
#define v(i,j,m) (i-1)*m+j
using namespace std;
short d[4][2] = {1,0,0,1,-1,0,0,-1};
char g[110][110];
int n, m, ans, f[10010];
int find(int x)
{
	if (f[x]!=x) f[x] = find(f[x]);
	return f[x];
}
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d %d\n", &n, &m);
		ans = 0;
		for (int i=1;i<=n;++i)
		{
			for (int j=1;j<=m;++j)
			{
				scanf("%c", &g[i][j]);
				if (g[i][j]=='#') ans++;
				f[v(i,j,m)] = v(i,j,m);
			}
			getchar();
		}
		for (int i=1;i<=n;++i)
		for (int j=1;j<=m;++j)
		if (g[i][j]=='#')
		{
			if (g[i-1][j]=='#' && g[i][j-1]=='#')
			{
				int a = find(v(i-1,j,m));
				int b = find(v(i,j-1,m));
				if (a!=b) f[b] = a, ans--;
				f[v(i,j,m)] = a, ans--;
			}
			else if (g[i-1][j]=='#')
			{
				f[v(i,j,m)] = find(v(i-1,j,m));
				ans--;
			}
			else if (g[i][j-1]=='#')
			{
        f[v(i,j,m)] = find(v(i,j-1,m));
				ans--;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}
		


 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章