题目链接: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. Git 基础 - 查看提交历史

    查看提交历史 在提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,可以使用 git log 命令查看. 接下来的例子会用我专门用于演示的 simplegit 项目,运行下面的命令获取该项目源 ...

  2. elastic-job(lite)使用的一些注意事项

    前段时间项目开发中用到了当当开源的elastic-job,使用过程遇到一些问题,虽然不见得会影响写代码,但作为一个致力于搬好每一块砖的码农,当碰到问题时,我们不应该逃避,应该本着有困难也要上,没有困难 ...

  3. 点击一个textView里的link导航至程序内可返回的自定义webView

    1,在AppDelegate.h里定义一个 id currentViewController; 在AppDelegate.m里 @implementation UIApplication (Priva ...

  4. MyEclipse 2016 CI修改web项目context-root

    右击项目properties——>搜索Deployment Assembly,修改如红框所示的Web Context Root

  5. Java——我的概念

    1.多态:(1)父类变量引用子类对象;(2)该引用只能调用父类中定义的方法和变量;(3)如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接.动态调用)

  6. AndroidWear开发之HelloWorld篇

    通过前一篇的学习,我们把环境都搭建好了,这下我们就可以正真的开发了. 一.创建Wear项目 通过项目创建向导一步一步下去就可以创建好一个Wear项目: 1.新建项目,一次填入应用名字,应用包名,项目位 ...

  7. c++11——可变参数模板

    在c++11之前,类模板和函数模板只能含有固定数量的模板参数,c++11增加了可变模板参数特性:允许模板定义中包含0到任意个模板参数.声明可变参数模板时,需要在typename或class后面加上省略 ...

  8. ubuntu解压命令

    .tar.gz 解压缩文件:  tar zxvf a.tar.gz 压缩文件命令:tar -zcvf test3.tar.gz  test1 test2 此命令是将两个文件夹 或文件同时压缩到一个文件 ...

  9. java的Result类

    import org.apache.commons.lang.StringUtils; import java.io.Serializable;import java.util.HashMap;imp ...

  10. wampserver3 集成环境 启动Apache失败

    前提:安装完成后,原先是能够启动服务,但是按照网上教程修改conf文件后就不能启动Apache, 方法: 1.查看Apache错误日志(无奈的是看不懂) 2.在cmd命令行中查看,(打开cmd,输入: ...