倒序操作用并查集判断是否连通,新技能get√(其实以前就会了

  这题细节很多。。。搞得整个程序都是调试输出,几度看不下去想要重写

  并查集到现在大概掌握了两个基本用途:判断是否连通 / 路径压缩(上一篇blog)UPD:判断某个区间是否被覆盖

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
const int dx[]={,,,-,},dy[]={,,,,-},maxn=;
int n,m,china,india,T,q,fa[maxn],x[maxn],y[maxn];
bool v[][],map[][],map2[][];
char s[maxn];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
int gf(int x){return fa[x]==x?x:fa[x]=gf(fa[x]);}
int bh(int x,int y)
{
if(x==)return n*m+;
if(x==n+)return n*m+;
return (x-)*m+y;
}
void dfs(int x,int y)
{
v[x][y]=;
for(int i=;i<=;i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>n||nx<||ny>m||ny<)continue;
if((!v[nx][ny])&&(!map[nx][ny])&&(!map2[nx][ny]))
fa[gf(bh(nx,ny))]=gf(bh(x,y)),dfs(nx,ny);
}
}
int main()
{
read(T);
while(T--)
{
memset(v,,sizeof(v));
memset(map,,sizeof(map));
memset(map2,,sizeof(map2));
read(n);read(m);china=n*m+;india=n*m+;
for(int i=;i<=n;i++)
{
scanf("%s",s);
for(int j=;j<m;j++)
map[i][j+]=s[j]-'';
}
read(q);
for(int i=;i<=q;i++)
{
read(x[i]);read(y[i]);
x[i]++;y[i]++;
map2[x[i]][y[i]]=;
}
for(int i=;i<=n*m+;i++)fa[i]=i;
for(int i=;i<=m;i++)
if((!map[][i])&&(!v[][i])&&(!map2[][i]))fa[gf(bh(,i))]=gf(china),dfs(,i);
for(int i=;i<=m;i++)
if((!map[n][i])&&(!v[n][i])&&(!map2[n][i]))fa[gf(bh(n,i))]=gf(india),dfs(n,i);
for(int i=;i<=n;i++)for(int j=;j<=m;j++)
if((!map[i][j])&&(!v[i][j])&&(!map2[i][j]))dfs(i,j);
if(gf(china)==gf(india))printf("-1\n");
else
for(int i=q;i;i--)
{
map2[x[i]][y[i]]=;
for(int j=;j<=;j++)
if((!map[x[i]+dx[j]][y[i]+dy[j]])&&(!map2[x[i]+dx[j]][y[i]+dy[j]]))
fa[gf(bh(x[i]+dx[j],y[i]+dy[j]))]=gf(bh(x[i],y[i]));
if(gf(china)==gf(india))
{
printf("%d\n",i);
break;
}
}
}
return ;
}

hdu5652:India and China Origins(并查集)的更多相关文章

  1. hdu5652 India and China Origins(并查集)

    India and China Origins  Accepts: 49  Submissions: 426  Time Limit: 2000/2000 MS (Java/Others)  Memo ...

  2. hdu 5652 India and China Origins 并查集+二分

    India and China Origins Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  3. hdu 5652 India and China Origins 并查集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题目大意:n*m的矩阵上,0为平原,1为山.q个询问,第i个询问给定坐标xi,yi,表示i年后这 ...

  4. hdu 5652 India and China Origins 并查集+逆序

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意:一张n*m个格子的点,0表示可走,1表示堵塞.每个节点都是四方向走.开始输入初始状态方格, ...

  5. hdu-5652 India and China Origins(二分+bfs判断连通)

    题目链接: India and China Origins Time Limit: 2000/2000 MS (Java/Others)     Memory Limit: 65536/65536 K ...

  6. 并查集(逆序处理):HDU 5652 India and China Origins

    India and China Origins Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  7. HDU 5652 India and China Origins(并查集)

    India and China Origins Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  8. HDU 5652 India and China Origins 二分+并查集

    India and China Origins 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5652 Description A long time ...

  9. HDU 5652 India and China Origins(经典并查集)

    特别经典的一个题,还有一种方法就是二分+bfs 题意:空间内n*m个点,每个点是0或者1,0代表此点可以走,1代表不能走.接着经过q年,每年一个坐标表示此点不能走.问哪年开始图上不能出现最上边不能到达 ...

随机推荐

  1. Qt listwigwt item 加入自定义元素

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  2. Linux命令应用大词典-第7章 字符串、文件和命令查找

    7.1 grep:字符串.文件和命令的查找 7.2 egrep:在文件或标准输入中查找模式 7.3 fgrep:在每个文件或是标准输入中查找模式 7.4 find:列出文件系统内符合条件的文件 7.5 ...

  3. 第五模块·WEB开发基础-第2章JavaScript基础

    第1章 JavaScript基础 01-JavaScript历史介绍 02-JavaScript的组成 03-JavaScript的引入方式 04-变量的使用 05-基本数据类型(一) 06-基本数据 ...

  4. unity初探之黑暗之光(2)

    unity初探之黑暗之光(2) 一.设置角色跟随鼠标点击移动 思路:使用charactercollider的SimpleMove方法来控制角色的移动.通过摄像机的射线投射到地面,通过屏幕上的一个点也就 ...

  5. 【机器学习】线性回归sklearn实现

    线性回归原理介绍 线性回归python实现 线性回归sklearn实现 这里使用sklearn框架实现线性回归.使用框架更方便,可以少写很多代码. 写了三个例子,分别是单变量的.双变量的和多变量的.单 ...

  6. Python高级编程-itertoos模块

    Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数. 首先我们看看itertools模块提供的几个“无限”迭代器, import itertools naturals = ...

  7. POJ 2208 Pyramids(求四面体体积)

    Description Recently in Farland, a country in Asia, a famous scientist Mr. Log Archeo has discovered ...

  8. HDU 2492 Ping pong(数学+树状数组)(2008 Asia Regional Beijing)

    Description N(3<=N<=20000) ping pong players live along a west-east street(consider the street ...

  9. gcc与g++区别以及相关参数详解

    ---恢复内容开始--- 原文链接:g++和gcc的区别 一 .二者区别 gcc和g++都是GNU(一个组织)的编译器. 1.对于.c后缀的文件,gcc把它当做是C程序:g++当做是C++程序: 2. ...

  10. c#笔记整理 关于继承与多态等

    [ 塔 · 第 二 条 约 定 ] c#面向对象基础 整理private.protected.public.abstract等的异同 public 公有访问.不受任何限制. private 私有访问. ...