题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652

题意:

很久以前,中国和印度之间并没有喜马拉雅山相隔,两国的文化交流很频繁。随着喜马拉雅山海拔逐渐增加,两个地区的交流也越来越少,最终没有了来往。
假设当时的地形和我画的一样,蓝色部分代表海洋,而且当时人们还没有发明轮船。黄色部分代表沙漠,而且沙漠上经常有野鬼散步,所以人们不敢到沙漠中行走。黑色的格子表示山峰,这些山峰都无比高大,所以人无法穿过。白色格子代表平原,
人可以在平原上自由行走。人每次可以向相邻的四个格子走动。 此外,我们的考古学家发现还有一些山峰会逐渐形成,通过研究发现,位置在 (x, y)(x,y) (保证该位置之前没有山峰)的地方在 ii 年后出现了山峰。现在给你若干个位置出现山峰的时间,
你可以计算出中国和印度之间的联系最早被彻底切断的时间吗?
输入描述
多组测试数据, 第一行为组数T(T≤10)。每组测试数据第一行包含两个数 N, M (1≤N,M≤500), 表示地图的大小。接下来 NN 行长度为 MM 的 0101 字符串。00代表白色格子,11 代表山峰。接下来有 Q(1≤Q≤N×M) 行,
第 i(1≤i≤Q) 两个整数 (x,y),0≤x<N,0≤y<M 表示在第 ii 年 (x,y) 出现了一座山峰。
输出描述
对于每组测试数据,输出一个数, 表示两国最早失联的时间。如果最终两国之间还有联系则输出 -1。

可以二分所有的时间,找到第一个让上下不连通的那个时间点;时间复杂度较高;

#include <stdio.h>
#include <algorithm>
#include<string.h>
#include<queue>
using namespace std; #define MOD 1000000007
#define N 550
typedef long long LL; char G[N][N];
int m, n, x[N*N], y[N*N]; int dir[][]= { {, }, {-,}, {, }, {, -} }; struct node
{
int x, y;
}; int bfs(int x, int y, char Maps[][N])
{
node p, q;
queue<node> Q;
p.x = x, p.y = y;
Q.push(p); int vis[N][N]; memset(vis, , sizeof(vis));
vis[x][y] = ; while(Q.size())
{
p = Q.front();
Q.pop(); if(p.x == n-)///可以连通;
return ; for(int i=; i<; i++)
{
q.x = p.x+dir[i][];
q.y = p.y+dir[i][]; if(q.x>= && q.x<n && q.y>= && q.y<m && Maps[q.x][q.y]=='' && !vis[q.x][q.y])
{
vis[q.x][q.y] = ;
Q.push(q);
}
}
}
return ;
} int Judge(char Maps[][N])
{
for(int i=; i<m; i++)
{
if(Maps[][i]=='')///枚举所有第一行可以走的点;
{
if( bfs(, i, Maps) )///如果可以连通;
return ;
}
}
return ;
} void Init(char Map[][N], int Mid)
{
memset(Map, , sizeof(Map)); for(int i=; i<n; i++)
for(int j=; j<m; j++)
Map[i][j] = G[i][j]; for(int i=; i<=Mid; i++)
Map[x[i]][y[i]] = '';
} int main()
{
int T, k; scanf("%d", &T); while(T--)
{
scanf("%d %d", &n, &m); for(int i=; i<n; i++)
scanf("%s", G[i]); scanf("%d", &k); for(int i=; i<=k; i++)
scanf("%d %d", &x[i], &y[i]); int L = , R = k, Mid = ; char Map[N][N]; while(L <= R)
{
Mid = (L+R) / ; Init(Map, Mid);///重新构造地图,判断第Mid年加上是否连通; if( !Judge(Map) )///不连通;
R = Mid - ;
else
L = Mid + ;
}
if(L > k) L = -; printf("%d\n", L);
}
return ;
}
/*
15
3 4
1100
0001
0000
2
0 3
2 0
*/
重新做了下一这道题;发现是可以用并查集做的,时间复杂度相当于O(Q)的一共有n*m个点,
我们可以编号为1-n*m我们把中国的区域地方看成编号0,印度的区域地方看成n*m+1;
然后把所有的山峰放上去,把所有(i,j)位置能到达的点(xi, yi)建立到一个集合中去;
倒着消除山峰,建立集合,当发现0和n*m+1在一个集中时,说明是当前山峰阻止了两国,答案就是当前山峰的年份;
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<math.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 550
#define PI 4*atan(1.0)
#define mod 110119
#define met(a, b) memset(a, b, sizeof(a))
typedef long long LL; int f[N*N], n, m, x[N*N], y[N*N];
char G[N][N];
int dir[][] = {{-,},{,},{,},{,-}}; int Find(int x)
{
if(x!=f[x])
f[x] = Find(f[x]);
return f[x];
} void Union(int a, int b)
{
int pa = Find(a);
int pb = Find(b);
if(pa != pb)
f[pa] = pb;
} int Cul(int X, int Y)
{
if(Y< || Y>=m) return -;
if(X == -) return ;
if(X == n) return n*m+;
if(G[X][Y] == '') return -;
return X*m + Y + ;
} int main()
{
int T, q;
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &n, &m); for(int i=; i<n; i++)
scanf("%s", G[i]); scanf("%d", &q);
for(int i=; i<=q; i++)
{
scanf("%d %d", &x[i], &y[i]);
G[x[i]][y[i]] = '';
} for(int i=; i<=n*m+; i++)///初始化f;
f[i] = i; for(int i=; i<n; i++)
for(int j=; j<m; j++)
{
if(G[i][j] == '') continue;
int num1 = Cul(i, j);///找到当前点的编号;
for(int k=; k<; k++)///与相邻的四点建立关系;
{
int p = i + dir[k][];
int q = j + dir[k][];
int num2 = Cul(p, q);
if(num2 != -)///-1代表不能联合;
Union(num1, num2);
}
}
for(int i=q; i>; i--)
{
G[x[i]][y[i]] = '';///消除当前山峰;建立联合;
int num1 = Cul(x[i], y[i]);
for(int k=; k<; k++)
{
int p = x[i] + dir[k][];
int q = y[i] + dir[k][];
int num2 = Cul(p, q);
if(num2 != -)
Union(num1, num2);
}
if(Find() == Find(m*n+))///当两点在一个集合中时;找到答案;
{
printf("%d\n", i);
break;
}
}
}
return ;
}

 
 

India and China Origins---hdu5652(二分 + bfs)或者(并查集)的更多相关文章

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

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

  2. hdu-5652 India and China Origins(二分+bfs判断连通)

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

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

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

  4. hdu5652 India and China Origins(并查集)

    India and China Origins  Accepts: 49  Submissions: 426  Time Limit: 2000/2000 MS (Java/Others)  Memo ...

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

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

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

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

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

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

随机推荐

  1. par函数usr参数-控制坐标系的范围

    在R语言中,会根据数据的范围自动计算x轴和y轴的范围,举个例子 比如绘制一个1到5的散点图:代码示例: plot(1:5, 1:5) 生成的图片如下: 从图片中我们可以看到,x轴的起始位置比1要小,终 ...

  2. openstack热迁移和冷迁移

    转自: http://www.cnblogs.com/pycode/p/6494848.html 迁移类型: *非在线迁移 (有时也称之为‘迁移’).也就是在迁移到另外的计算节点时的这段时间虚拟机实例 ...

  3. 【Java面试题】14 super.getClass()方法调用

    下面程序的输出结果是多少? import java.util.Date; public class Test extends Date{ public static void main(String[ ...

  4. shiro缓存

    shiro的可以权限控制内容包括:URL地址.Web页面的元素.以及方法,即shiro对用户权限的控制是细粒度的.从用户的一次访问来说,他可能需要最多经过三种.多次的验证.这里的多次怎么说呢?如果说W ...

  5. Unity3D工程源码目录

    2-0    暗黑破坏神3 链接:http://pan.baidu.com/s/1dEAUZoX 密码:cly4 2-1    炉石传说 客户端加服务器端 链接:http://pan.baidu.co ...

  6. Win10关闭自动更新

    1.搜索栏输入“组策略”后回车 2.找到计算机配置→管理模板→Windows组件→Windows更新 3.在右侧双击“配置自动更新”,然后选择“已启用”,在左下方下拉菜单中选择“2 - 通知下载并通知 ...

  7. 【RF库Collections测试】Dictionary Should Contain Key

    Name:Dictionary Should Contain KeySource:Collections <test library>Arguments:[ dictionary | ke ...

  8. Linux命令之乐--grep

    正则表达式基本组成部分 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 /* St ...

  9. discuz 文档说明

    Discuz  文档说明 基于7.0的标准程序,部分与插件无关的文件不作说明 文件颜色说明: 红色:程序核心文件,修改这类文件时千万要注意安全! 橙色:做插件几乎不会用到的文件,大概了解功能就可以了, ...

  10. vs2008设置dll、lib库的输出路径

    vs2008中,有些项目上的功能是要生产库文件给其他项目调用的,以下是一些设置库文件(x.dll和x.lib)输出路径的方法. 设置x.dll 输出路径方法是在右键项目的"属性"- ...