图论问题(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种选择,然后相邻两个图只有都和对方连接,才判断他们 ...
随机推荐
- 关于使用IDEA,使用Maven打包项目
关于使用IDEA,使用Maven打包项目 在近期的一个接口项目中,使用的是SpringBoot + Maven的配置, 由于使用IDEA不久,不太熟悉使用Maven进行项目打包.记录一下. 由于使用的 ...
- MySQL数据库中查询表的所有列名
MySQL数据库中: 查询某个数据库中某个表的所有列名 SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ...
- 修改Hexo自动生成的HTML文件名
导读 我们在使用Hexo框架生成静态博客时,其实是将你写好的.md文件输出成HTML文件进行渲染,其中HTML的文件名称就是.md的文件名称. 而我们为了编辑文章方便,为了通过文件名就知道这是哪篇文章 ...
- 设置 VMware 中的 Mac OS 虚拟机进入 Recovery 模式
Ø 简介 本文主要介绍 VMware 中的 Mac OS 虚拟机如何进入 Recovery 模式的方法,具体步骤如下: 1. 选择 Mac OS 虚拟机,点击"打开电源是进入固件&qu ...
- Chrome教程之使用Chrome DevTools命令菜单运行命令
1.模拟移动设备 点击 Toggle Device Toolbar 2.限制网络流量和 CPU 占用率 要限制网络流量和 CPU 占用率,请从 Throttle 列表中选择 Mid-tier mobi ...
- Winform中设置ZedGraph鼠标滚轮缩放的灵敏度以及设置滚轮缩放的方式(鼠标焦点为中心还是图形中心点)
场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...
- Javaweb常用解决问题连接
1.javaweb的idea如何创建及配置web项目 https://www.jianshu.com/p/8d49d36a3c7e 2.servlet的建立以及部署 https://blog.csdn ...
- 在秉火STM32F429挑战者开发板上移植Huawei LiteOS指南
昨天在B站上突然看到了一个短视频,是在正点原子的战舰V3开发板上移植华为的Huawei LiteOS操作系统,就是这个视频:看完鸿蒙OS发布会,试用华为的物联网操作系统Lite OS(B站),于是呢, ...
- python中pip添加国内镜像源后显著加速下载
python中pip添加国内镜像源后显著加速下载 更换pip源到国内镜像,很多国外的库下载非常慢,添加国内镜像后安装下载速度提升非常明显(亲测有些可以由几十kb加速到几MB) pip国内的一些镜像阿里 ...
- H3C路由器设置NAT回环、端口回流
起因 当用本地服务器作为frp的服务端时,需要在路由器上设置端口映射,将公网ip和本地ip映射起来,用于作为frps的公网,这一步很简单一般都会有可视化界面来实现,但实际测试时发现问题: 当非局域网内 ...