题目链接: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函数cex参数-控制文字和点的大小

    cex参数用来控制图片中点和文字的大小,对于一副图片来说,有很多的文字部分,包括x轴标签(xlab), y轴标签(ylab), x轴刻度上的文字, y轴刻度上的文字,主标题(main), 副标题(su ...

  2. keepalived双BACKUP加nopreempt失效、手动监控服务脚步。

    keepalived双BACKUP加nopreempt不起作用,两个机器同时拥有vip, 排查几天发现是防火墙问题,啃爹. 打开  vi /etc/sysconfig/iptables 插入一条:-A ...

  3. javaScript实现归并排序

    归并排序是一个O(nlogn)的算法,其基本思想就是一个分治的策略,先进行划分,然后再进行合并,下面举个例子.有这样一组数据: {5,4,1,22,12,32,45,21} 如果对它进行归并排序的话, ...

  4. 【java】 java设计模式(3):单例模式(Singleton)

    单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔 ...

  5. Java信号量 Semaphore 介绍

    一.介绍 Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用.Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore ...

  6. 【linux】安装rar,并解压被压缩成多个rar的文件

    rar  官网:http://www.rarsoft.com/download.htm 选择  RAR for  linux   (注意你的系统是32位还是64位) 1 安装命令: $ cd /roo ...

  7. 【thinkphp5】 分页样式修改

    1 找到文件:/thinkphp/library/think/paginator/driver/Bootstrap.php <?php // +------------------------- ...

  8. 图片上传转base64

    代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  9. webpack中,require的五种用法

    a.js: module.exports = function(x){ console.log(x); } 一,commonjs同步: var b = require('./a');b('你好')// ...

  10. 【BZOJ2554】Color 概率神题

    [BZOJ2554]Color Description 有n个球排成一列,每个球都有一个颜色,用A-Z的大写字母来表示,我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色,求期望操作 ...