hdu 1198 Farm Irrigation
令人蛋疼的并查集……
我居然做了大量的枚举,居然过了,我越来越佩服自己了
这个题有些像一个叫做“水管工”的游戏。给你一个m*n的图,每个单位可以有11种选择,然后相邻两个图只有都和对方连接,才判断他们连接。然后找这里面有多少个连通图。
给大家一个一点也不高大上,但是一眼就能看懂的代码吧……
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; const int N = ; char mpc[N][N]; //第一次输入
bool mp[N*N][N*N]; //整理单向连通
bool mps[N*N][N*N]; //记录双向连通
int fm[N*N]; //并查集父节点,不用多说了吧……
int m, n;
int sum; void change2(int k, int x, int y) //四个方向连通
{
switch(k)
{
case :
if(x- >= ) mp[x*m+y][(x-)*m+y] = ; break;
case :
if(y- >= ) mp[x*m+y][x*m+y-] = ; break;
case :
if(x+ < n)mp[x*m+y][(x+)*m+y] = ; break;
case :
if(y+ < m) mp[x*m+y][x*m+y+] = ; break;
}
} void change(int x, int y) //11个图的连接方式
{
switch(mpc[x][y]-'A')
{
case :
change2(, x, y);
change2(, x, y);
break;
case :
change2(, x, y);
change2(, x, y);
break;
case :
change2(, x, y);
change2(, x, y);
break;
case :
change2(, x, y);
change2(, x, y);
break;
case :
change2(, x, y);
change2(, x, y);
break;
case :
change2(, x, y);
change2(, x, y);
break;
case :
change2(, x, y);
change2(, x, y);
change2(, x, y);
break;
case :
change2(, x, y);
change2(, x, y);
change2(, x, y);
break;
case :
change2(, x, y);
change2(, x, y);
change2(, x, y);
break;
case :
change2(, x, y);
change2(, x, y);
change2(, x, y);
break;
case :
change2(, x, y);
change2(, x, y);
change2(, x, y);
change2(, x, y);
break;
}
} int fd(int x) //寻找父节点
{
while(x != fm[x])
{
x = fm[x];
}
return x;
} void link(int x, int fx) //合并+压缩
{
int mx;
while(x != fm[x])
{
mx = x;
x = fm[x];
fm[mx] = fx;
}
fm[x] = fx;
} void jp(int x, int y)
{
int fx = fd(x);
int fy = fd(y);
if(fx != fy)
{
link(x, fx);
link(y, fx);
sum++; //统计连接的点的个数
} } int main()
{
//freopen("test.txt", "r", stdin);
while(~scanf("%d%d", &n, &m) && n != - && m != -)
{
memset(mp, , sizeof(mp));
memset(mps, , sizeof(mps));
memset(mpc, , sizeof(mpc));
for(int i = ; i < m*n; i++) fm[i] = i; for(int i = ; i < n; i++)
{
scanf("%s", mpc[i]);
for(int j = ; j < m; j++)
{
change(i, j);
}
}
for(int i = ; i < n*m; i++)
{
for(int j = ; j < i ; j++)
{
if(mp[i][j] && mp[j][i]) mps[i][j] = ;
}
} sum = ;
for(int i = ; i < n*m; i++)
{
for(int j = ; j < i; j++)
{
if(mps[i][j]) jp(i, j);
}
}
//for(int i = 0; i < m*n; i++) if(fm[i] == i) sum++; printf("%d\n", n*m-sum);
}
return ;
}
对了,这个题dfs也能做,只是我不想再写了……
hdu 1198 Farm Irrigation的更多相关文章
- HDU 1198 Farm Irrigation(状态压缩+DFS)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1198 题目: Farm Irrigation Time Limit: 2000/1000 MS (Ja ...
- hdu.1198.Farm Irrigation(dfs +放大建图)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 1198 Farm Irrigation (并检查集合 和 dfs两种实现)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 1198 Farm Irrigation(并查集,自己构造连通条件或者dfs)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- HDU 1198 Farm Irrigation(并查集+位运算)
Farm Irrigation Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Tot ...
- hdu 1198 Farm Irrigation(深搜dfs || 并查集)
转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm ...
- HDU 1198 Farm Irrigation (并查集优化,构图)
本题和HDU畅通project类似.仅仅只是畅通project给出了数的连通关系, 而此题须要自己推断连通关系,即两个水管能否够连接到一起,也是本题的难点所在. 记录状态.不断combine(),注意 ...
- hdu 1198 Farm Irrigation(并查集)
题意: Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a ...
- HDU 2412 Farm Irrigation
题目: Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a ...
随机推荐
- 【hadoop2.6.0】倒排索引遇到问题了
想实现书上倒排索引的例子,但是我不会java想用C++写,如果用hadoop streaming 那么输入必须是标准输入的形式, 那么我怎么获得每个文件的文件名呢? 查了一下,还有一种方法叫做hado ...
- Matlab安装
第一步:下载MATLAB 7.0,下载自己百度下就好. 三个ios文件 第二步:把每个IOS文件直接右键解压就好. 第三步:打开第一个解压文件夹.双击.exe文件 第四步:next之后把序列号黏贴上去 ...
- ActiveMQ 学习笔记
http://somebody-hjh.iteye.com/blog/726050 一.概述 Message,即消息.人与人之间通过消息传递信息.言语.眼神.肢体动作都可被视为消息体.当然还有我们经常 ...
- CTSC2016&&APIO2016游记
4.30 下午衡中放假,我们因为比赛的缘故提前到中午12:00放假 然后我爸爸说要来接我,直到下午两点多他才到,然后衡中宿舍的楼管阿姨死活不给我开门 莫名其妙的等到了三点多快四点的时候我才跟实验班的一 ...
- Java学习笔记之:Java数组
一.介绍 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如number ...
- Hibernate逍遥游记-第13章 映射实体关联关系-002用主键映射一对一(<one-to-one constrained="true">、<generator class="foreign">)
1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...
- Loongnix 系统(MIPS Linux)
电脑上的x86,手机上的ARM,在各自领域都是很成熟的CPU架构了,龙芯也参与进去竞争是很难的,就算是Intel,挤破头皮疯狂补贴自家的Atom x86还是在手机领域无法立足. 所以说,个人觉得龙芯可 ...
- underscore.js 一个强大的js函数库
Underscore提供的100多个函数,主要涉及对Collection.Object.Array.Function的操作: Collections(集合) each, map, reduce, re ...
- SqlServer 如何以脚本形式导出数据
你是否遇到这样的情况,在公司导出一个数据库,回到家里导入自己的电脑里,然后发现数据库版本不匹配,这真是一个悲剧. 那么以下这个方法就可以避免这个悲剧,将数据以脚本的形式导出,这样灵活性更好. 1.选择 ...
- 如何设计Java框架----一个简单的例子【翻译】
原文:http://www.programcreek.com/2011/09/how-to-design-a-java-framework/ 原文和翻译都只是参考,如有不对,欢迎指正. 你可能会好奇框 ...