点击打开链接

并查集:

#include<cstdio>
#define N 505
using namespace std;
struct node
{
int x,y;
};
char map[N][N];
node p[N*N];
int turnx[4]={0,0,-1,1};
int turny[4]={-1,1,0,0};
int father[N*N];
int rank[N*N];
int find(int x)
{
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
void connect(int a,int b)
{
a=find(a);
b=find(b);
if(a!=b)
{
if(rank[a]>rank[b])
father[b]=a;
else if(rank[a]<rank[b])
father[a]=b;
else
{
father[a]=b;
rank[b]++;
}
}
}
int main()
{
int T;
int i,j;
int n,m,q;
int china,india;
int dx,dy;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%s",map[i]+1);
scanf("%d",&q);
for(i=1;i<=q;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
++p[i].x,++p[i].y;
map[p[i].x][p[i].y]='1';
}
for(i=1;i<=n*m+2;i++)
{
father[i]=i;
rank[i]=0;
}
china=n*m+1;
india=n*m+2;
for(i=1;i<=m;i++)
{
if(map[1][i]=='0')
connect(i,china);
if(map[n][i]=='0')
connect((n-1)*m+i,india);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(map[i][j]=='0')
{
if(i<n&&map[i+1][j]=='0')
connect(i*m+j,(i-1)*m+j);
if(j<m&&map[i][j+1]=='0')
connect((i-1)*m+j+1,(i-1)*m+j);
}
}
}
if(find(china)==find(india))
{
printf("-1\n");
continue;
}
for(i=q;i>0;i--)
{
map[p[i].x][p[i].y]='0';
if(p[i].x==1)
connect(p[i].y,china);
if(p[i].x==n)
connect((n-1)*m+p[i].y,india);
for(j=0;j<4;j++)
{
dx=p[i].x+turnx[j];
dy=p[i].y+turny[j];
if(dx>0&&dx<=n&&dy>=0&&dy<=m&&map[dx][dy]=='0')
connect((dx-1)*m+dy,(p[i].x-1)*m+p[i].y);
}
if(find(china)==find(india))
break;
}
printf("%d\n",i);
}
return 0;
}

BFS+二分:

#include<cstdio>
#include<queue>
#include<cstring>
#include<stack>
using namespace std;
int n,m;
char map[510][510];
int visit[510][510];
int turnx[4]={1,-1,0,0};
int turny[4]={0,0,1,-1};
struct node
{
int x;
int y;
};
node u[300000];
int yes(int x,int y)
{
if(x<0||y<0||x>n+1||y>=m||map[x][y]=='1')
return 0;
return 1;
}
queue<node> s;
int bfs()
{
int i;
node p,q;
p.x=0;
p.y=0;
visit[p.x][p.y]=1;
s.push(p);
while(!s.empty())
{
p=s.front();
s.pop();
if(p.x==n+1&&p.y==0)
{
while(!s.empty())
s.pop();
return 1;
}
for(i=0;i<4;i++)
{
q=p;
q.x+=turnx[i];
q.y+=turny[i];
if(!visit[q.x][q.y]&&yes(q.x,q.y))
{
visit[q.x][q.y]=1;
s.push(q);
}
}
}
return 0;
}
int main()
{
int T,Q,i,begin,end,mid;
scanf("%d",&T);
while(T--)
{
while(!s.empty())
s.pop();
scanf("%d%d",&n,&m);
for(i=0;i<m;i++)
{
map[0][i]='0';
map[n+1][i]='0';
}
memset(visit,0,sizeof(visit));
for(i=1;i<=n;i++)
scanf("%s",map[i]);
scanf("%d",&Q);
for(i=1;i<=Q;i++)
{
scanf("%d%d",&u[i].x,&u[i].y);
++u[i].x;
}
begin=1;
end=Q;
while(begin<=end)
{
mid=(begin+end)/2;
memset(visit,0,sizeof(visit));
for(i=begin;i<=mid;i++)
map[u[i].x][u[i].y]='1';
for(i=mid+1;i<=end;i++)
map[u[i].x][u[i].y]='0';
if(bfs()==1)
begin=mid+1;
else
end=mid;
if(begin==end)
{
mid=begin;
break;
}
}
printf("%d\n",mid);
}
return 0;
}

(并查集 or BFS+二分)HDU5652的更多相关文章

  1. 【bzoj5049】[Lydsy九月月赛]导航系统 并查集+双向BFS最短路

    题目描述 给你一张 $n$ 个点 $m$ 条边的随机图,边权为1.$k$ 次询问两点间最短路,不连通则输出-1. 输入 第一行包含3个正整数n,m,k(2<=n<=100000,1< ...

  2. 求树的直径+并查集(bfs,dfs都可以)hdu4514

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...

  3. 【CF659F】Polycarp and Hay(并查集,bfs)

    题意: 构造一个矩阵,使得: 矩阵所有格子中数字都小于等于原矩阵,并且至少有一个元素和原矩阵相等, 构造的矩阵除了0以外的数字必须联通并且相等,矩阵中元素之和为K. n,m<=1e3,1< ...

  4. [Bzoj1821][JSOI2010]Group 部落划分 Group(并查集)(二分答案)

    1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2949  Solved: 1392[S ...

  5. hdu 4750 Count The Pairs(并查集+二分)

    Problem Description With the 60th anniversary celebration of Nanjing University of Science and Techn ...

  6. 并查集+二分-hdu-4750-Count The Pairs

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4750 题目大意: 给一无向图,n个点,m条边,每条边有个长度,且不一样.定义f(i,j)表示从节点i ...

  7. [CF1386C] Joker (IOI 赛制,分治,整体二分+可回退并查集)

    题面 给一个 N N N 点 M M M 边的简单无向图,询问 Q Q Q 次,每次问你把编号在 [ l i , r i ] [l_i,r_i] [li​,ri​] 之间的边删掉后,该图是否存在奇数环 ...

  8. HDU 1272 小希的迷宫 并查集

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  9. hdu 5652 India and China Origins(二分+bfs || 并查集)BestCoder Round #77 (div.2)

    题意: 给一个n*m的矩阵作为地图,0为通路,1为阻碍.只能向上下左右四个方向走.每一年会在一个通路上长出一个阻碍,求第几年最上面一行与最下面一行会被隔开. 输入: 首行一个整数t,表示共有t组数据. ...

随机推荐

  1. hdu----(4513)吉哥系列故事——完美队形II(manacher(最长回文串算法))

    吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  2. hdu------(1525)Euclid's Game(博弈决策树)

    Euclid's Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  3. 接入WebSocket

    闲扯 WebSocket 以前没用过,之前写过一篇博客是基于原生socket的(查看)比较复杂,慎入.今天另外一个APP需要接websocket了,然后便找到了facebook的 SocketRock ...

  4. Sui 弹框固定

    SUI是一套基于bootstrap开发的前端组件库,同时它也是一套设计规范,可以非常方便的设计和实现精美的页面,是一个简单易用.功能强大的UI库.自己在使用sui过程之中,总是忘记它的一些Api,今天 ...

  5. mysql把查询的结果格式成日期

    SELECT *,FROM_UNIXTIME(addtime, '%Y-%m-%d %H:%i:%S') as riqi FROM `test`

  6. JMETER JDBC操作

    本文目标 1.添加测试计划 2.配置JDBC连接 3.插入数据 4.使用控制器 5.查看插入结果   1.添加测试计划 添加mysql驱动   2.添加测试计划 3.添加JDBC连接   在这里JDB ...

  7. C++ fstream stringstream

    一.文件输入输出 C/C++ 输入: freopen("in.cpp", "r", stdin); fclose(stdin); 输出: freopen(&qu ...

  8. linux系统设置静态IP 查看网卡配置文件

    http://jingyan.baidu.com/article/455a99508be7cda167277865.html vi /etc/sysconfig/network-scripts/ifc ...

  9. qml android 的一个例子qtHangMan

    这个例子有2个好处: 1.解决了黑屏问题 2.演示了应用内购买的问题

  10. linux内核启动笔记

    一. 1.解压    tar xjf linux-2.6.22.6.tar.bz2 2.打补丁  patch -p1 < ../linux-2.6.22.6_jz2440.patch 3.配置 ...