点击打开链接

并查集:

#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. IO流 总结一

    字符流: FileReader FileWriter BufferedReader BufferedWriter readLine(); 字节流: FileInputReader FileOutput ...

  2. 初始jQuery

    JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF1.5+, Safari 2.0+, Opera ...

  3. PHP 页面编码声明方法详解(header或meta)

    php的header来定义一个php页面为utf编码或GBK编码 php页面为utf编码 header("Content-type: text/html; charset=utf-8&quo ...

  4. econ

    1) If Ep > 1, Demand is elastic. 2) If Ep < 1, Demand is inelastic 3) If Ep = 1, Demand has un ...

  5. js刷新页面和跳转

    javascript返回上一页: 1.返回上一页 history.go(-1); 返回上两个页面 history.go(-2); <a href="javascript:history ...

  6. 执行MAVEN更新包

    我们一般使用 mvn eclipse:eclipse 执行对maven库的引用,这样会修改项目下的classpath文件. 我们修改直接在eclipse 使用maven库作为项目的引用. 步骤如下: ...

  7. 闲聊CSS之关于clearfix--清除浮动[转]

    .clearfix:after { content: " "; display: block; clear: both; height:; } .clearfix { zoom:; ...

  8. FZU 2032 Log函数问题 模拟小数加法

    题目链接:Log函数问题 2 / 49 Problem G FZU 2032 Log函数问题 不知道为什么...比赛时高精度难倒了一票人...成功搞出大新闻... 试了一下直接double相加超时,然 ...

  9. 转: CSS中overflow的用法

    Overflow可以实现隐藏超出对象内容,同时也有显示与隐藏滚动条的作用,overflow属性有四个值:visible (默认), hidden, scroll, 和auto.同样有两个overflo ...

  10. c# MVC在WEB.Config中配置MIME

    在IIS中,默认没有添加.json格式的MIME,所有无法读取服务器中的.json格式的文件,返回结果404 方式一:在IIS中手动添加MIME 1.点击MIME进入MIME列表 2.添加MIME 3 ...