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); } }
相关文章推荐
- iOS-OC-NSMutableArray用法大全详细说明
- Android开发:使用Glide动态加载圆形图片和圆角图片
- ubuntu 上安装opencv以及测试
- iOS蓝牙4.0协议简单介绍
- DB2表结构DDL脚本导出
- iOS-OC-NSArray用法大全详细说明
- codevs 1571 电车
- jquery-zclip插件
- centos下对硬盘进行分区和格式化为指定的文件系统
- EventBus-通信框架
- 使用base64:URL的优缺点
- Problem N
- BW ZCHANGE_PACKAGE
- 在mac console下 执行c++文件
- PSP记录个人项目耗时情况
- SharedPreferences详解
- Problem P
- iOS-OC-NSDictionary和NSMutableDictionary用法大全详细说明
- DataBinding学习(五)
- 区块链需要解决诸多问题