您的位置:首页 > 其它

hdu1198 并查集

2016-03-21 11:48 387 查看
题意:有如上图11种土地块,块中的绿色线条为土地块中修好的水渠,现在一片土地由上述的各种土地块组成,需要浇水,问需要打多少口井。

思路:其实就是求连通的水渠有多少个,就会想到并查集;这里由于每个土地对应四个方向,所以我们就需要从四个方向考虑是否连通,我们可以简化成由第一个开始,那么我们就只需判断每个土地是否与右下连通;然后再根据并查集判断连通的土地共有多少个;

代码:

#include<stdio.h>
int res[11][4]={1,1,0,0,
0,1,1,0,
1,0,0,1,
0,0,1,1,
0,1,0,1,
1,0,1,0,
1,1,1,0,
1,1,0,1,
1,0,1,1,
0,1,1,1,
1,1,1,1,};
int a[9999999],ans;
char map[551][551];
int n,m,vag;
int find(int t)
{
if(t!=a[t])
a[t]=find(a[t]);
return a[t];
}
void init()
{
for(int i=1;i<=n*m;i++)
a[i]=i;
ans=n*m;
}
void sort(int ax,int ay,int bx,int by,int tt)
{
int vis=0;
if(bx>n||by>m)
return;
if(tt)
{
if(res[map[ax][ay]-'A'][3]&&res[map[bx][by]-'A'][1])
vis=1;
}
else
if(res[map[ax][ay]-'A'][2]&&res[map[bx][by]-'A'][0])
vis=1;
if(vis)
{
int dx=find((ax-1)*m+ay);
int dy=find((bx-1)*m+by);
if(dx!=dy)
{
a[dx]=dy;
ans--;
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==-1&&m==-1)
break;
int i,j,k;
init();
vag=1;
for(i=1;i<=n;i++)
scanf("%s",map[i]+1);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
sort(i,j,i+1,j,vag);
sort(i,j,i,j+1,!vag);
}
printf("%d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: