zoj3781
zoj3781
赛场上堵在了缩点上emmmmm
把原始图相同颜色的方块缩成一个点,然后与它周围不同颜色的联通块连双向边,然后枚举每个点然后求最大深度的最小值
因为每次翻转都相当于深度+1(可以手动模拟一下
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<set>
#include<map>
#include<stack>
#include<cstring>
#define inf 2147483647
#define ls rt<<1
#define rs rt<<1|1
#define lson ls,nl,mid,l,r
#define rson rs,mid+1,nr,l,r
#define N 100010
#define For(i,a,b) for(register int i=a;i<=b;i++)
#define p(a) putchar(a)
#define g() getchar() using namespace std;
int T;
int n,m;
int deep[];
char a[][];
bool b[][];
int col[][];
bool vis[][],v[];
int cnt;
int ans;
queue<int>q; struct node{
int n;
node *next;
}*e[]; void in(int &x){
int y=;
char c=g();x=;
while(c<''||c>''){
if(c=='-')y=-;
c=g();
}
while(c<=''&&c>=''){
x=(x<<)+(x<<)+c-'';c=g();
}
x*=y;
}
void o(int x){
if(x<){
p('-');
x=-x;
}
if(x>)o(x/);
p(x%+'');
} void clean(){
For(i,,n)
For(j,,m){ vis[i][j]=;
col[i][j]=;
}
For(i,,n*m)
For(j,,n*m){
b[j][i]=;
b[i][j]=;
} For(i,,)
e[i]=;
cnt=;
ans=inf; } void push(int x,int y){
node *p;
p=new node();
p->n=y;
if(e[x]==)
e[x]=p;
else{
p->next=e[x]->next;
e[x]->next=p;
}
} void dfs(int x,int y,char f,int color){
if(x<||y<||x>n||y>m)
return;
if(vis[x][y])
return;
if(a[x][y]==f){
vis[x][y]=;
col[x][y]=color;
dfs(x-,y,f,color);
dfs(x,y-,f,color);
dfs(x,y+,f,color);
dfs(x+,y,f,color);
}
} void ccc(int x,int y){
if(x<||y<||x>n||y>m)
return;
vis[x][y]=;
if(x->&&!b[col[x][y]][col[x-][y]]){
if(col[x][y]!=col[x-][y]){
push(col[x][y],col[x-][y]);
push(col[x-][y],col[x][y]);
b[col[x][y]][col[x-][y]]=;
b[col[x-][y]][col[x][y]]=;
}
if(vis[x-][y])
ccc(x-,y);
}
if(y->&&!b[col[x][y]][col[x][y-]]){
if(col[x][y]!=col[x][y-]){
push(col[x][y],col[x][y-]);
push(col[x][y-],col[x][y]);
b[col[x][y]][col[x][y-]]=;
b[col[x][y-]][col[x][y]]=;
}
if(vis[x][y-])
ccc(x,y-);
}
if(x+<=n&&!b[col[x][y]][col[x+][y]]){
if(col[x][y]!=col[x+][y]){
push(col[x][y],col[x+][y]);
push(col[x+][y],col[x][y]);
b[col[x][y]][col[x+][y]]=;
b[col[x+][y]][col[x][y]]=;
}
if(vis[x+][y])
ccc(x+,y);
}
if(y+<=m&&!b[col[x][y]][col[x][y+]]){
if(col[x][y]!=col[x][y+]){
push(col[x][y],col[x][y+]);
push(col[x][y+],col[x][y]);
b[col[x][y]][col[x][y+]]=;
b[col[x][y+]][col[x][y]]=;
}
if(vis[x][y+])
ccc(x,y+);
}
} void bfs(int x){
deep[x]=;
q.push(x);
For(i,,cnt)
v[i]=;
v[x]=;
int ss=;
while(!q.empty()){
int t=q.front();q.pop();
for(node *i=e[t];i;i=i->next)
if(!v[i->n]){
v[i->n]=;
q.push(i->n);
deep[i->n]=deep[t]+;
ss=max(ss,deep[i->n]);
}
}
ans=min(ss,ans);
} int main(){
in(T);
while(T--){
in(n);in(m);
clean();
For(i,,n)
For(j,,m)
cin>>a[i][j];
For(i,,n)
For(j,,m)
if(!vis[i][j])
dfs(i,j,a[i][j],++cnt);
ccc(,);
For(i,,cnt)
bfs(i);
o(ans);p('\n');
}
return ;
}
zoj3781的更多相关文章
- [ZOJ3781]Paint the Grid Reloaded
思路: 先用DFS缩点,然后BFS找出每个点出发能到达的最长路,取$min$. 注意多组数据,初始化一定要仔细,刚开始存边的$e$忘记初始化,一直WA,调了半个晚上. 一开始和网上的题解对拍$T=1$ ...
随机推荐
- 删除链表倒数第n个节点
题目: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链 ...
- 前端神器之jquery
jquery介绍 jQuery是目前使用最广泛的javascript函数库.据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库.微软公司甚至把jQuery作为他们的官方库. ...
- Kubernetes之RBAC
API Server的授权管理 API Server 内部通过用户认证后,然后进入授权流程.对合法用户进行授权并且随后在用户访问时进行鉴权,是权限管理的重要环节.API Server 目前支持一下几种 ...
- kubernetes云平台管理实战:deployment通过标签管理pod(十)
一.kubectl run命令拓展 1.RC创建 [root@k8s-master ~]# kubectl run web --generator=run/v1 --image=10.0.128.0: ...
- [JDK8]性能优化之使用LongAdder替换AtomicLong
如果让你实现一个计数器,有点经验的同学可以很快的想到使用AtomicInteger或者AtomicLong进行简单的封装. 因为计数器操作涉及到内存的可见性和线程之间的竞争,而Atomic***的实现 ...
- 第十九节: 结合【表达式目录树】来封装EF的BaseDal层的方法
一. 简介 该章节,可以说是一个简单轻松的章节,只要你对Expression表达式树.EF的基本使用.泛型有所了解,那么本章节实质上就是一个非常简单的封装章节,便于我们快捷开发. PS:在该章节对于E ...
- [物理学与PDEs]第5章第2节 变形的描述, 应变张量 2.3 位移梯度张量与无穷小应变张量
1. 位移向量 $$\bex {\bf u}={\bf y}-{\bf x}. \eex$$ 2. 位移梯度张量 $$\bex \n_x{\bf u}={\bf F}-{\bf I}. \eex$ ...
- rem是怎么计算的
「rem」是指根元素(root element,html)的字体大小,从遥远的 IE6 到版本到 Chrome 他们都约好了,根元素默认的 font-size 都是 16px. rem是通过根元素进行 ...
- 分别基于TensorFlow、PyTorch、Keras的深度学习动手练习项目
×下面资源个人全都跑了一遍,不会出现仅是字符而无法运行的状况,运行环境: Geoffrey Hinton在多次访谈中讲到深度学习研究人员不要仅仅只停留在理论上,要多编程.个人在学习中也体会到单单的看理 ...
- 安装scala
Linux 环境 安装 下载的scala linux 压缩包放在目录 "/usr/scala “下 解压 tar -zxvf scala-2.11.8.tgz 再配置环境, 编辑文件 ”vi ...