(并查集 or BFS+二分)HDU5652
并查集:
- #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的更多相关文章
- 【bzoj5049】[Lydsy九月月赛]导航系统 并查集+双向BFS最短路
题目描述 给你一张 $n$ 个点 $m$ 条边的随机图,边权为1.$k$ 次询问两点间最短路,不连通则输出-1. 输入 第一行包含3个正整数n,m,k(2<=n<=100000,1< ...
- 求树的直径+并查集(bfs,dfs都可以)hdu4514
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 这题主要是叫我们求出树的直径,在求树的直径之前要先判断一下有没有环 树的直径指的就是一棵树上面距 ...
- 【CF659F】Polycarp and Hay(并查集,bfs)
题意: 构造一个矩阵,使得: 矩阵所有格子中数字都小于等于原矩阵,并且至少有一个元素和原矩阵相等, 构造的矩阵除了0以外的数字必须联通并且相等,矩阵中元素之和为K. n,m<=1e3,1< ...
- [Bzoj1821][JSOI2010]Group 部落划分 Group(并查集)(二分答案)
1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2949 Solved: 1392[S ...
- hdu 4750 Count The Pairs(并查集+二分)
Problem Description With the 60th anniversary celebration of Nanjing University of Science and Techn ...
- 并查集+二分-hdu-4750-Count The Pairs
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4750 题目大意: 给一无向图,n个点,m条边,每条边有个长度,且不一样.定义f(i,j)表示从节点i ...
- [CF1386C] Joker (IOI 赛制,分治,整体二分+可回退并查集)
题面 给一个 N N N 点 M M M 边的简单无向图,询问 Q Q Q 次,每次问你把编号在 [ l i , r i ] [l_i,r_i] [li,ri] 之间的边删掉后,该图是否存在奇数环 ...
- HDU 1272 小希的迷宫 并查集
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- hdu 5652 India and China Origins(二分+bfs || 并查集)BestCoder Round #77 (div.2)
题意: 给一个n*m的矩阵作为地图,0为通路,1为阻碍.只能向上下左右四个方向走.每一年会在一个通路上长出一个阻碍,求第几年最上面一行与最下面一行会被隔开. 输入: 首行一个整数t,表示共有t组数据. ...
随机推荐
- 学习HTML5之塔克大战(详细记录)
学了一些HTML5的一些基本知识,开始学习制作...... 介绍一些基本知识: px(像素)--->1px等于多少? 1cm or 2cm -->no no no! (1).像素是一个 ...
- 企业级的响应式设计(Responsive design at enterprise level)译
导言 响应式设计是现在人们谈论的热点,但如何部署,特别是在有多种设备的大型项目中如何组织响应式设计,响应式设计和可伸缩性(Scalable)有什么区别?这都是需要解决的难题. 优化用户经验——Opti ...
- Objective-C(二、类和对象)
类和对象 #import是include的升级版,可以自动防止重复包含,所以注意:大家以后在引入头文件的时候都使用import Foundation是一个框架,Foundation.h是Founda ...
- C++构造函数和析构函数调用虚函数时都不会使用动态联编
先看一个例子: #include <iostream> using namespace std; class A{ public: A() { show(); } virtual void ...
- jar转dll
IKVM http://www.cnblogs.com/luckeryin/archive/2012/03/28/2421274.html
- BZOJ2721 [Violet 5]樱花
先令n! = a: 1 / x + 1 / y = 1 / a => x = y * a / (y - a) 再令 k = y - a: 于是x = a + a ^ 2 / k => ...
- android 定制目录
首先简单介绍一下安卓系统文件夹对照表 主要介绍的是Android系统的文件夹结构,帮助大家更直观地了解系统 \\system\\app这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结 ...
- Mongodb Management Studio
1.服务器管理功能添加服务器,删除服务器 2.服务器,数据库,表,列,索引,树形显示和状态信息查看 3.查询分析器功能.支持select,insert,Delete,update支持自定义分页函数 $ ...
- 这是BUG吗?
百度首页的控制台里,有一段招聘信息,想必大家都知道吧,点击里面的链接地址跳到了百度招聘页面然后就发现了这个:,如果这不是BUG的话,那用户体验真是不好
- 用for循环打印菱形
package nothh; public class mmm { public static void main(String[] args) { //for循环内的 for按顺序运算,先打印1/4 ...