点击打开链接

并查集:

#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. IP的正则表达式

    首先分析IP地址0-255: 0-9:       [0-9]或 \d表示数字 10-99:   [1-9]\d 100-199: 1/d{2} 200-249:    2[0-4]\d 250-25 ...

  2. C#中结构体和类的区别

    结构体和类同样能够定义字段,方法和构造函数,都能实例化对象,这样看来结构体和类的功能好像是一样的了,但是他们在数据的存储上是不一样的 C#结构体和类的区别问题:这两种数据类型的本质区别主要是各自指向的 ...

  3. springmvc:BeanNameViewResolver访问内部资源视图对象和访问外部资源视图对象

    <!-- 处理器映射器 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerM ...

  4. HDU 3466

    Proud Merchants Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...

  5. bzoj 2744: [HEOI2012]朋友圈

    #include<cstdio> #include<iostream> #define M 3010 using namespace std; ],u[M*M>>] ...

  6. JAVA异常体系

    1.异常体系 ----|Throwable 所有错误或异常的父类 --------|Error(错误) --------|Exception(异常)一般能通过代码处理 ------------|运行时 ...

  7. [mr440] 崎岖的山区

    极类似动归的广搜?反正各种算法傻傻分不清…写之前叹了一句,好久不写广搜了啊!呵呵真的写了好久,大约一个钟头? f[i,j,0]表示到点(i,j)且最后一步为下降的最少步数,f[i,j,1]就是上升.莫 ...

  8. Map学习

    1.Query Operations(查询操作) int size();boolean isEmpty(); boolean containsKey(Object key);boolean conta ...

  9. SOD 精选细节--常用工具

    要明白一个思想:  SOD 只是帮你拼接sql语句, 用简单的方式来帮你实现.   不要理解错了.这很重要的! 查询: TB table=new TB(); table.Name="111& ...

  10. [pjsip]板砖理解pjsip体系结构

    在pjsip的官方开发向导中给出两张体系结构图,分别是消息流程图和类图,如下所示: 图1:消息流程图 图2:类图