题目转自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的更多相关文章

  1. 图论问题(2) : hdu 1102

    题目转自hdu 1102,题目传送门 题目大意: 输入一个n*n的邻接矩阵,其中i行j列代表从i到j的路径的长度 然后又m条路已经帮你修好了,求最短要修多长的路才能使所有村庄连接 不难看出,这道题就是 ...

  2. hdu 1198 (并查集 or dfs) Farm Irrigation

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1198 有题目图11种土地块,块中的绿色线条为土地块中修好的水渠,现在一片土地由上述的各种土地块组成,需要浇 ...

  3. HDU 1198

    http://acm.hdu.edu.cn/showproblem.php?pid=1198 裸并查集,主要工作在根据题目给出关系构图 #include <iostream> #inclu ...

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

    转载请注明出处:viewmode=contents">http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm ...

  5. HDU 1198 Farm Irrigation(状态压缩+DFS)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1198 题目: Farm Irrigation Time Limit: 2000/1000 MS (Ja ...

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

    本题和HDU畅通project类似.仅仅只是畅通project给出了数的连通关系, 而此题须要自己推断连通关系,即两个水管能否够连接到一起,也是本题的难点所在. 记录状态.不断combine(),注意 ...

  7. hdu.1198.Farm Irrigation(dfs +放大建图)

    Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. HDU 1198(并查集)

    题意:给你11个图,每一个都有管道,然后给一张由这11个正方形中的n个组成的图,判断有几条连通的管道: 思路:在大一暑假的时候做过这道题,当时是当暴力来做的,正解是并查集,需要进行一下转换: 转换1: ...

  9. hdu 1198 Farm Irrigation

    令人蛋疼的并查集…… 我居然做了大量的枚举,居然过了,我越来越佩服自己了 这个题有些像一个叫做“水管工”的游戏.给你一个m*n的图,每个单位可以有11种选择,然后相邻两个图只有都和对方连接,才判断他们 ...

随机推荐

  1. Docker学习4-学会如何让容器开机自启服务

    前言 小龙亲测重启服务器后 docker 容器没跑起来,相信有不少小伙伴在用docker部署容器的时候也发现每次开机服务就没有自启了,需要手动去执行把容器服务开启起来,但有没有可以让它开机自启呢?显然 ...

  2. mysql快速安装教程详解

    Mysql 一.在https://www.cnblogs.com/zyx110/p/10799387.html中下载如下图中的压缩包 二.将mysql压缩包解压至c盘根目录下 三.把配置文件中的东西复 ...

  3. C#,WPF,DataGrid,Excel,导出

    private void btnExport_Click(object sender, RoutedEventArgs e) { System.Diagnostics.Stopwatch sw = n ...

  4. c# 值类型和引用类型 笔记

    参考以下博文,我这里只是笔记一下,原文会更加详细 c#基础系列1---深入理解值类型和引用类型 堆栈和托管堆c# 值类型和引用类型 红色表示——“这啥?”(真实1个问题引出3个问题) CLR支持的两种 ...

  5. RV32I基础整数指令集

    RV32I是32位基础整数指令集,它支持32位寻址空间,支持字节地址访问,仅支持小端格式(little-endian,高地址高位,低地址地位),寄存器也是32位整数寄存器.RV32I指令集的目的是尽量 ...

  6. Qt时间转换 当前时间

    当前时间 qDebug() << QTime::currentTime().toString(Qt::ISODate); //"15:23:48" qDebug() & ...

  7. 电信NBIOT 3 - 数据下行

    电信NBIOT 1 - 数据上行(中国电信开发者平台对接流程) 电信NBIOT 2 - 数据上行(中间件获取电信消息通知) 电信NBIOT 3 - 数据下行 电信NBIOT 4 - NB73模块上行测 ...

  8. updataStateByKey算子的使用

    updataStateByKeyApp.scala import org.apache.spark.SparkConf import org.apache.spark.streaming.{Secon ...

  9. Linux 读写锁

    线程的读写锁函数: 1,读写锁的初始化与销毁,静态初始化的话,可以直接使用PTHREAD_RWLOCK_INITIALIZER. #include <pthread.h> int pthr ...

  10. 一次http请求的过程

    http协议(超文本传输协议)是属于应用层的协议,网络分层:应用层(http协议,FTP),传输层(tcp,udp),网络层(ip/ARP),链路层 我们以浏览器向百度发送请求为例: http的发送: ...