HDU 1198 Farm Irrigation (并查集优化,构图)

本题和HDU畅通工程类似,只不过畅通工程给出了数的连通关系,

而此题需要自己判断连通关系,即两个水管是否可以连接到一起,也是本题的难点所在。

记录状态,不断combine(),注意只需要判断左方和上方就行,这样不会重复判断,而且肯定都可以遍历到所有的状态。

#include<stdio.h>
#include<iostream>
#include<string>
//记录水管的形状,每种水管用一个由'0'和'1'组成的长度为4的字符串代表,
//分别表示上下左右四边是否有接口,'0'无,'1'有
char a[11][5]={"1010","1001","0110","0101","1100","0011",
               "1011","1110","0111","1101","1111"};
int father[51][51];
char map[51][51];
int n,m;
using namespace std;
int find(int x)//查找父节点,并压缩路径
{
	if(father[x/n][x%n]!=x)
		father[x/n][x%n]=find(father[x/n][x%n]);
	return father[x/n][x%n];
}

void Union(int x,int y)//合并x,y的集合
{
	x=find(x);
	y=find(y);
	if(x!=y)
		father[y/n][y%n]=x;
}

void judge(int i,int j)//判断map[i][j]和它的左侧和上侧是否连通,如连通则合并
{
	if(j>0&&a[map[i][j]-'A'][2]=='1'&&a[map[i][j-1]-'A'][3]=='1')//判断上方
		Union(i*n+j,i*n+j-1);

	if(i>0&&a[map[i][j]-'A'][0]=='1'&&a[map[i-1][j]-'A'][1]=='1')//判断左方
		Union(i*n+j,(i-1)*n+j);
}

int main()
{
	int i,j,count;
	while(scanf("%d%d",&m,&n)!=-1&&(n!=-1||m!=-1))
	{
		for(i=0;i<m;i++)
		{
			scanf("%s",map[i]);//输入矩阵
			for(j=0;j<n;j++)
				father[i][j]=i*n+j;//将父节点初始化
		}

		for(i=0;i<m;i++)
			for(j=0;j<n;j++)
				judge(i,j);

			count=0;//查找父节点是本身的点的个数,即共有几个集合
			for(i=0;i<m;i++)
				for(j=0;j<n;j++)
					if(father[i][j]==i*n+j)
						count++;
					printf("%d\n",count);
	}
	return 0;
}
时间: 2024-10-25 05:52:25

HDU 1198 Farm Irrigation (并查集优化,构图)的相关文章

HDU 1198 Farm Irrigation (并查集)

Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5809    Accepted Submission(s): 2516 Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectangle,

hdu 1198 Farm Irrigation (搜索或并查集)

Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5818    Accepted Submission(s): 2521 Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectangle

hdu 1198 Farm Irrigation(深搜dfs || 并查集)

转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1198 ----------------------------------------------------------------------------------------------------------------------

HDU 1198 Farm Irrigation(并查集,自己构造连通条件)

Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11188    Accepted Submission(s): 4876 Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectangle

HDU 1198 Farm Irrigation(并查集+位运算)

Farm Irrigation Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 38   Accepted Submission(s) : 24 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Benny has a spacious

hdu 1198 Farm Irrigation(15ms)

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6608    Accepted Submission(s): 2848 Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided

HDU--1198 Farm Irrigation (并查集做法+DFS做法)

Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a lot of samll squares. Water pipes are placed in these squares. Different square has a different type of pipe. There are 11 types of pi

HDU 1198 Farm Irrigation

Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7897    Accepted Submission(s): 3418 Problem Description Benny has a spacious farm land to irrigate. The farm land is a rectangle

【HDOJ】1198 Farm Irrigation

其实就是并查集,写麻烦了,同样的代码第一次提交wa了,第二次就过了. 1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXNUM 55 5 #define UP 0 6 #define RIGHT 1 7 #define DOWN 2 8 #define LEFT 3 9 10 char buf[MAXNUM][MAXNUM]; 11 int bin[MAXNUM*MAXNUM]; 12 char visit[MAXN