(并查集 or BFS+二分)HDU5652
并查集:
#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的更多相关文章
- 【bzoj5049】[Lydsy九月月赛]导航系统 并查集+双向BFS最短路
题目描述 给你一张 $n$ 个点 $m$ 条边的随机图,边权为1.$k$ 次询问两点间最短路,不连通则输出-1. 输入 第一行包含3个正整数n,m,k(2<=n<=100000,1< ...
- 求树的直径+并查集(bfs,dfs都可以)hdu4514
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...
- 【CF659F】Polycarp and Hay(并查集,bfs)
题意: 构造一个矩阵,使得: 矩阵所有格子中数字都小于等于原矩阵,并且至少有一个元素和原矩阵相等, 构造的矩阵除了0以外的数字必须联通并且相等,矩阵中元素之和为K. n,m<=1e3,1< ...
- [Bzoj1821][JSOI2010]Group 部落划分 Group(并查集)(二分答案)
1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2949 Solved: 1392[S ...
- hdu 4750 Count The Pairs(并查集+二分)
Problem Description With the 60th anniversary celebration of Nanjing University of Science and Techn ...
- 并查集+二分-hdu-4750-Count The Pairs
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4750 题目大意: 给一无向图,n个点,m条边,每条边有个长度,且不一样.定义f(i,j)表示从节点i ...
- [CF1386C] Joker (IOI 赛制,分治,整体二分+可回退并查集)
题面 给一个 N N N 点 M M M 边的简单无向图,询问 Q Q Q 次,每次问你把编号在 [ l i , r i ] [l_i,r_i] [li,ri] 之间的边删掉后,该图是否存在奇数环 ...
- HDU 1272 小希的迷宫 并查集
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- hdu 5652 India and China Origins(二分+bfs || 并查集)BestCoder Round #77 (div.2)
题意: 给一个n*m的矩阵作为地图,0为通路,1为阻碍.只能向上下左右四个方向走.每一年会在一个通路上长出一个阻碍,求第几年最上面一行与最下面一行会被隔开. 输入: 首行一个整数t,表示共有t组数据. ...
随机推荐
- java编程思想
Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理 ...
- 84. Largest Rectangle in Histogram *HARD* -- 求柱状图中的最大矩形面积
Given n non-negative integers representing the histogram's bar height where the width of each bar is ...
- iOS项目的目录结构和开发流程
转自无网不剩的博客 网上相关的资源不多,开源的且质量还不错的iOS项目也是少之又少,最近正好跟同事合作了一个iOS项目,来说说自己的一些想法. 目录结构 AppDelegate Models Ma ...
- 转载解决:错误的语法:”XXXX“必须是批处理中仅有的语句
SQL Server 数据库提示“错误的语法:”XXXX“必须是批处理中仅有的语句”报错的原因分析 解析:批处理必须以 CREATE 语句开始.也就是说一个查询分析器里面只有一个批处理语句才是规范的语 ...
- hdu5883 The Best Path(欧拉路)
题目链接:hdu5883 The Best Path 比赛第一遍做的时候没有考虑回路要枚举起点的情况导致WA了一发orz 节点 i 的贡献为((du[i] / 2) % 2)* a[i] 欧拉回路的起 ...
- 500 TypeError: Cannot read property 'connect.sid' of undefined
1:在写passport验证测试用例时,发现有几个引用中间件顺序的错误,检查发现,passport验证写的是session,在传错误信息的时候req.flash调用也需要用到session中间件,否则 ...
- JavaScript实现冒泡排序、快速排序、插入排序
JavaScript实现冒泡排序.快速排序.插入排序 时间:2014-01-09 18:05:51 来源: 作者:胡晗 冒泡排序的基本思想:所谓冒泡就是泡泡一个一个往上冒,让体积最轻的泡泡浮在最上 ...
- dw添加emmet
1.emmet下载Emmet.zxp 2.怎么在dw中设置(命令->emmet->Expand Abbreviation)中查看使用emmet的快捷键,如果跟别人快捷键重合了 3.编辑-& ...
- 无需激活用户直接登入discuz
//打开discuz/api/uc.php //synlogin方法(180行)处,往下找到 if(($member = getuserbyuid($uid, 1))) { dsetcookie('a ...
- 时钟 IoTimer
/* 例程是在运行在DISPATCH_LEVEL的IRQL级别 例程中不能使用分页内存 另外在函数首部使用 #pragma LOCKEDCODE */ #include "Driver.h& ...