HDU1198(Farm Irrigation)-并查集
2012-08-15 17:44
225 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198
package D0815; /* * 给定一些土地的样板,要你求需要的最少的水泵的数目。 * 思路:并查集 * 将土地信息存在二维数组中,遍历,判断每块土地的右边和下边的一块土地的 * 样子,如果符合条件,合并集合 * 要想合并集合,必须满足 * 当前土地:B||D||F||G||I||J||K * 右边土地:A||C||F||G||H||I||K * * 当前土地:C||D||E||H||I||J||K * 下一土地:A||B||E||G||H||J||K * 注意:最后一行只需要判断右边的土地,最后一列只需要判断下面的土地 * */ import java.util.*; public class HDU1198 { static char[][]map; static int wellsprings; static int m,n; static int[]set; static int[]height; public static void init(int k){ set = new int[k]; height = new int[k]; for(int i = 0;i<k;i++){ set[i] = i; height[i] = 1; } map = new char[m] ; } public static int find(int x){ while(x!=set[x]) x = set[x]; return x; } public static void merge(int a,int b){ a = find(a); b = find(b); if(a!=b){ if(height[a]>height[b]) set[b] = a; else if(height[a]<height[b]) set[a] = b; else{ set[b] = a; height[a]++; } } } public static void sove(){ for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (i != m - 1) {// 不是最后一行,判断该土地的下面一块土地, if ((map[i][j] == 'C' || map[i][j] == 'D' || map[i][j] == 'E' || map[i][j] == 'H' || map[i][j] == 'I' || map[i][j] == 'J' || map[i][j] == 'K') && (map[i + 1][j] == 'A' || map[i + 1][j] == 'B' || map[i + 1][j] == 'E' || map[i + 1][j] == 'G' || map[i + 1][j] == 'H' || map[i + 1][j] == 'J' || map[i + 1][j] == 'K')) { merge(i*n+j,(i+1)*n+j); } } if(j!=n-1){// 不是最后一列,判断该土地的右边一块土地 if ((map[i][j] == 'B' || map[i][j] == 'D' || map[i][j] == 'F' || map[i][j] == 'G' || map[i][j] == 'I' || map[i][j] == 'J' || map[i][j] == 'K') && (map[i][j + 1] == 'A' || map[i][j + 1] == 'C' || map[i][j + 1] == 'F' || map[i][j + 1] == 'G' || map[i][j + 1] == 'H' || map[i][j + 1] == 'I' || map[i][j + 1] == 'K')) { merge(i*n+j,i*n+j+1); } } } } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str; while(sc.hasNext()){ m = sc.nextInt(); n = sc.nextInt(); if(m<0||n<0)break; wellsprings = m*n; //初始化数组 init(m*n); for(int i = 0;i<m;i++){ str = sc.next(); //将str转化成字符数组 char[] ch = str.toCharArray(); for(int j = 0;j<n;j++){ map[i][j]= ch[j]; } } sove(); int sum = 0; for(int i = 0;i< m*n;i++){ if(i==set[i]) sum++; } System.out.println(sum); } } }
相关文章推荐
- Hdu1198 - Farm Irrigation - 并查集
- hdu1198 Farm Irrigation 并查集或者dfs
- K-Farm Irrigation|并查集
- HDU-1198 Farm Irrigation 并查集
- hdu1198 并查集(值得复习)
- HDU 1198 Farm Irrigation (并查集优化,构图)
- Farm Irrigation(并查集)
- HDU 1198 Farm Irrigation (并查集 和 dfs两种实现)
- hdu1198(并查集的应用)
- HDOJ 1198 Farm Irrigation 并查集
- hdu1198 Farm Irrigation ----并查集
- hdu1198 并查集
- HDU 1198 Farm Irrigation (并查集)
- 并查集(模版题HDOJ1232 畅通工程)(HDOJ1198 Farm Irrigation)
- hdu1198(并查集)
- hdu 1198 Farm Irrigation (并查集)
- Farm Irrigation(并查集)
- HDU1198(不必暴力,并查集应用,0MS)
- hdu1198(并查集)
- HDU1198 Farm Irrigation