题目大意:给你一个地图0代表可以通过1代表不可以通过。只要能从第一行走到最后一行,那么中国与印度是可以联通的。现在给你q个点,每年风沙会按顺序侵蚀这个点,使改点不可通过。问几年后中国与印度不连通。若一直联通输出-1.

题目思路:看数据这道题就是卡时间的,我们的基本思路是每当风沙侵蚀一个点,我们就进行一次广搜,看看图上下是否联通,我们应尽可能的去优化这个过程。

所以我们可以在遍历年的时候用二分查找:

若当年图可以上下联通,则继续向右查找

若当年图上下无法联通,则向左查找

剪枝:

为了省时间我们应该剪去一些不必要走的路径:假设第一行的x点在第n年已经不可达到最后一行,那么我们就标记一下,在m(m>n)年时,不对x点经行广搜。

具体看代码:

#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define INF 0x3f3f3f3f
#define MAX 1000005
#define mod 1000000007 using namespace std;
struct node
{
int x,y;
};
char Map[][];
int vis[][],n,m,q,a[MAX],b[MAX],book[MAX],v[][]= {{,},{-,},{,},{,-}},Stack[MAX]; int check(int x,int y)
{
if(x>= && x<n && y>= && y<m && !vis[x][y] && Map[x][y]=='')
return ;
return ;
} int BFS(int x,int y)
{
vis[x][y]=;
node now,next;
now.x=x;
now.y=y;
queue<node>Q;
Q.push(now);
while(!Q.empty())
{
now=Q.front();
Q.pop();
if(now.x==n-)
{
return ;
}
for(int i=; i<; i++)
{
next.x=now.x+v[i][];
next.y=now.y+v[i][];
if(check(next.x,next.y))
{
vis[next.x][next.y]=;
Q.push(next);
}
}
}
return ;
} int main()
{
int T,i,j,ans,ok1,ok2,ok,L,R,top;
scanf("%d",&T);
while(T--)
{
ok1=;//记录第一行是否有可行点
ok2=;//记录第二行是否有可行点
ok=;
scanf("%d%d",&n,&m);
for(i=; i<n; i++)
scanf("%s",Map[i]);
scanf("%d",&q);
for(i=; i<=q; i++)
scanf("%d%d",&a[i],&b[i]);
for(i=; i<m; i++)
{
if(Map[][i]=='')
ok1=;
if(Map[n-][i]=='')
ok2=;
}
if(ok1 && ok2)
ok=;
if(!ok)//若第一行或最后一行无可行点,直接输出0
{
printf("0\n");
continue;
}
ans=;
L=;
R=q;
memset(book,,sizeof(book));//记录第一行被剪去的点
while(R>L)//二分查找年份
{
top=;
int mid=L+(R-L)/;
for(i=; i<=mid; i++)//当前为mid年,更新地图被侵蚀的点
{
int x=a[i];
int y=b[i];
Map[x][y]='';
}
ok=;
for(i=; i<m; i++)
{
if(Map[][i]=='' && !book[i])
{
memset(vis,,sizeof(vis));
ok=BFS(,i);
if(ok)//当年图上下可连通
break;
else
{
Stack[++top]=i;//若该点无法到达最后一行,记录改点为可能要被剪去的点
}
}
} if(ok)
{
L=mid+;
ans=max(ans,mid);
for(j=; j<=top; j++)//剪枝
{
int num=Stack[j];
book[num]=;
}
top=;
}
else
{
R=mid;
} for(i=; i<=mid; i++)//还原地图
{
int x=a[i];
int y=b[i];
Map[x][y]='';
}
} ok=;
for(i=; i<=L; i++)
{
int x=a[i];
int y=b[i];
Map[x][y]='';
}
for(i=; i<m; i++)
{
if(Map[][i]=='' && !book[i])
{
memset(vis,,sizeof(vis));
ok=BFS(,i);
if(ok)
break;
else
{
Stack[++top]=i;
}
}
}
if(ok)
ans=L; if(ans == q)
ans=-;
else
ans++;
printf("%d\n",ans);
}
return ;
}

HDU 5652 India and China Origins 二分优化+BFS剪枝的更多相关文章

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

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

  2. (hdu)5652 India and China Origins 二分+dfs

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5652 Problem Description A long time ago there ...

  3. hdu 5652 India and China Origins 二分+bfs

    题目链接 给一个图, 由01组成, 1不能走. 给q个操作, 每个操作将一个点变为1, 问至少多少个操作之后, 图的上方和下方不联通. 二分操作, 然后bfs判联通就好了. #include < ...

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

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

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

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

  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 并查集

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

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

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

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

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

随机推荐

  1. Udemy - Angular 2 - The Complete Guide 笔记

    1. install > npm install -g angular-cli 2. create app > ng new first-app 3. build app > cd ...

  2. yii框架中关于控制器中filter过滤器和外部action的使用

    在yii框架中,控制器的过滤器分为执行前和执行后,这里举例是在执行控制器前的过滤. 需要在components/文件夹下定义公共的TestAction.php文件,并且实现run()方法.这个acti ...

  3. 使用某些Widows API时,明明包含了该头文件,却报错“error C2065: undeclared identifier”

    在使用一些新版本的API,或者控件的新特性(比如新版的ComCtl32.dll)的时候,你可能会得到“error C2065: undeclared identifier.“这个错误.原因是这些功能是 ...

  4. Day06 杂乱与4个对象

    1.杂乱 -- 数据库的分页操作 -- 分页使用的是rownum 例1: select rownum,empno,ename from emp ; 结果: 例2: select r,empno,ena ...

  5. 一些常用数据库操作在mysql及sql server中实现方式的差异

    因为本文强调的是不同点,所以先讲述不同点,再讲相同点. 一.不同点 1.创建表时主键id的自增实现方式不一样 mysql数据库的实现方式是auto_increment,示例如下 CREATE TABL ...

  6. 欧几里得算法求最大公约数(gcd)

    关于欧几里得算法求最大公约数算法, 代码如下: int gcd( int a , int b ) { if( b == 0 ) return a ; else gcd( b , a % b ) ; } ...

  7. SuperMapPy 批量拼接 GeoTiff影像

    影像拼接工具使用说明 一.影像像素位深检查 1.采用开源库GDAL的gdalinfo.exe读取GeoTiff文件的信息,如类型.投影,范围等. 2.采用DOS脚本遍历所有GeoTiff文件,输出各个 ...

  8. android代码格式化方法小结

    转载:http://blog.csdn.net/androidzhaoxiaogang/article/details/7692526 Download the android-formatting. ...

  9. MFC应用程序编写实例—完整版(原创)

    前段时间,将近花了一周至两周上班和上班后的闲余时间,做了一个用于调试和测试工作项目的应用软件,下面将实现软件的重要步骤及主要功能讲解一遍,方便日后查阅. 程序开始后,提示登录框,输入用户名,密码后,登 ...

  10. MyBatis和SpringMVC集成事务在Junit测试下有效但是在实际项目无效的问题

    一.问题说明 项目框架采用SSM,集成了事务回滚(方式见下),在单元测试的时候,测试事务是有效的,但是在实际项目上线的时候,却没有效果. 二.集成方式 application-mybatis.xml( ...