图论问题(1) : hdu 1198
题目转自hdu 1198,题目传送门
题目大意:
给你11种单位水管摆放位置,若上下或左右有水管连接则视为这两点相连。
最后让你求这些张图中有几个连通块。
解题思路:
本来觉得这道题很简单,不就一个建图在并查集不就完了吗?
(如果连并查集都不会,请点此学习一下)
当然,并没有这么简单(在T了十几次后终于明白)
然后,我们可以发现,每个单位只有4个方向。
很容易想到用二进制进行状态压缩
压缩代码如下:
int change(char ch)
{
switch(ch)
{
case 'A':return ;
case 'B':return ;
case 'C':return ;
case 'D':return ;
case 'E':return ;
case 'F':return ;
case 'G':return ;
case 'H':return ;
case 'I':return ;
case 'J':return ;
case 'K':return ;
}
}
然后写一个并查集模板就应该可以AC了(本人没试过)
可能是因为T太多回了,所以产生了心理阴影
于是,本人不厌其烦地去写时间复杂度更低的算法
在思考了近10min后,我终于有点头绪了
提到二进制,我最先想到的就是位运算
我就想,这道题能不能用位运算优化呢?
实际上是可以的,在思考了15min后我认可了这种想法
接着我用不到10min的时间肝了一段用位运算优化建图过程的代码
优化核心代码如下:
if(i>&&((e[i][j]>>)&(e[i-][j]>>)&)) Union(i*m+j,(i-)*m+j);
if(j>&&((e[i][j-]>>)&e[i][j]&)) Union(i*m+j,i*m+j-);
p.s.:中间的Union是并查集中的合并
位运算我就不解释了(暴怒蒟蒻在线虐人)
然后,又随便写了10min的并查集模板,就愉快地AC了
AC代码如下:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char e[][];
int fa[];
bool vis[];
int ans,n,m;
int Init()
{
for(int i=(n+)*(m+);i>=;i--) fa[i]=i;
}
int change(char ch)
{
switch(ch)
{
case 'A':return ;
case 'B':return ;
case 'C':return ;
case 'D':return ;
case 'E':return ;
case 'F':return ;
case 'G':return ;
case 'H':return ;
case 'I':return ;
case 'J':return ;
case 'K':return ;
}
}
int find(int x)
{
if(fa[x]==x) return x;
else
{
fa[x]=find(fa[x]);
return fa[x];
}
}
void Union(int x,int y)
{
int tmp_x=find(x),tmp_y=find(y);
fa[tmp_y]=tmp_x;
return;
}
int main()
{
while(~scanf("%d%d",&n,&m)&&n!=-)
{
getchar();
Init();
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
scanf("%c",&e[i][j]);
e[i][j]=change(e[i][j]);
if(i>&&((e[i][j]>>)&(e[i-][j]>>)&)) Union(i*m+j,(i-)*m+j);
if(j>&&((e[i][j-]>>)&e[i][j]&)) Union(i*m+j,i*m+j-);
}
getchar();
}
ans=;
memset(vis,,sizeof(vis));
for(int i=;i<n;i++) for(int j=;j<m;j++) if(!vis[find(i*m+j)])
{
vis[find(i*m+j)]=true;
ans++;
}
cout<<ans<<endl;
}
return ;
}
emmmm......
提交之后我发现才14ms......(早知道我就不写位运算优化了)
这道题告诉我们,T了不可怕
可怕的是你害怕T掉,所以就花了更多时间去肝最优解(结果发现没啥卵用!)
图论问题(1) : hdu 1198的更多相关文章
- 图论问题(2) : hdu 1102
题目转自hdu 1102,题目传送门 题目大意: 输入一个n*n的邻接矩阵,其中i行j列代表从i到j的路径的长度 然后又m条路已经帮你修好了,求最短要修多长的路才能使所有村庄连接 不难看出,这道题就是 ...
- hdu 1198 (并查集 or dfs) Farm Irrigation
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1198 有题目图11种土地块,块中的绿色线条为土地块中修好的水渠,现在一片土地由上述的各种土地块组成,需要浇 ...
- HDU 1198
http://acm.hdu.edu.cn/showproblem.php?pid=1198 裸并查集,主要工作在根据题目给出关系构图 #include <iostream> #inclu ...
- hdu 1198 Farm Irrigation(深搜dfs || 并查集)
转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm ...
- 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 (并查集优化,构图)
本题和HDU畅通project类似.仅仅只是畅通project给出了数的连通关系, 而此题须要自己推断连通关系,即两个水管能否够连接到一起,也是本题的难点所在. 记录状态.不断combine(),注意 ...
- hdu.1198.Farm Irrigation(dfs +放大建图)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 1198(并查集)
题意:给你11个图,每一个都有管道,然后给一张由这11个正方形中的n个组成的图,判断有几条连通的管道: 思路:在大一暑假的时候做过这道题,当时是当暴力来做的,正解是并查集,需要进行一下转换: 转换1: ...
- hdu 1198 Farm Irrigation
令人蛋疼的并查集…… 我居然做了大量的枚举,居然过了,我越来越佩服自己了 这个题有些像一个叫做“水管工”的游戏.给你一个m*n的图,每个单位可以有11种选择,然后相邻两个图只有都和对方连接,才判断他们 ...
随机推荐
- Qt+FFmpeg 简单实现视频播放
这里使用 Qt + FFmpeg 实现了一个简单播放视频的例子.先看下按下按钮播放视频时的效果图: 完整工程下载链接:Github-FFmpeg_demo 注意:一定要将 bin 目录下的 dll 文 ...
- VS Code 提示‘未找到Git。请安装Git,或在“git.path”设置中配置’
一.情况说明 1.描述 从Git上克隆出代码,用vscode打开项目提示“未找到Git.请安装Git,或在“git.path”设置中配置” 2.截图 二.报错原因 .没有安装Git .没有设置Git路 ...
- 【shell脚本】定时备份日志===logBackup.sh
定时备份日志 设置执行权限 [root@VM_0_10_centos shellScript]# chmod a+x logBackup,sh 脚本内容 [root@VM_0_10_centos sh ...
- JSON转成List结构数据
先要引入对应的jar,然后调用net.sf.json库的 ObjectMapper mapper = new ObjectMapper(); JavaType javaType = mapper.ge ...
- C# if-else 语句
一.简介 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行. 二.语法 If(判断条件) { 执行的代码: } else { 执行的代码: } 描述: 执行 ...
- 执行http脚本
Invoke-Expression (Invoke-WebRequest http://10.16.2.5:81/Configcmd.ps1).content
- linux桌面系统的约定
linux系统的桌面系统基本遵循同样的约定. mime类型 在linux下,关于文件类型的信息通常放在/usr/share/mime./usr/local/share/mime和用户目录下,所有应用程 ...
- windows下编写dll
dll的优点 简单的说,dll有以下几个优点: 1) 节省内存.同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中.如果 ...
- 前端开发JS——数组
25.数组 1)声明数组: ①构造函数创建数组 var arr = new Array(); console.log(arr): //[] var arr = new Array(2 ...
- 使用highcharts实现无其他信息纯趋势图实战实例
使用highcharts实现无其他信息纯趋势图实战实例 Highcharts去掉或者隐藏掉y轴的刻度线yAxis : { gridLineWidth: 0, labels:{ //enabled:fa ...