[bzoj4651]网格

考虑将最上中最左的跳蚤孤立,容易发现他的上面和左面没有跳蚤,因此只需要将他的右边和下边替换掉就可以了
答案为-1有两种情况:1.c>=n*m-1;2.c=n*m-2且这两只跳蚤相邻
对于其他情况,将所有跳蚤建图后判断:1.是否有多个连通块;2.是否有割点即可,由于跳蚤数量很多,容易发现只需要选择周围5*5的范围内有蛐蛐的跳蚤建图即可
只选择3*3会有反例(以下q表示蛐蛐,t表示跳蚤):
ttttt
tttqt
ttttt
tqttt
ttttt
(注意如果c=0那么答案为((n>1)&&(m>1))+1)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 100005
 4 #define mp make_pair
 5 #define pii pair<int,int>
 6 struct ji{
 7     int nex,to;
 8 }edge[N<<5];
 9 queue<pii >q;
10 map<pii ,int>a,mat;
11 int t,n,m,k,x[N],y[N],tx[4]={-1,0,0,1},ty[4]={0,-1,1,0};
12 int V,E,head[N<<2],vis[N<<2],dfn[N<<2],low[N<<2],sum[N<<2];
13 void add(int x,int y){
14     edge[E].nex=head[x];
15     edge[E].to=y;
16     head[x]=E++;
17 }
18 void dfs(int k,int fa){
19     low[k]=dfn[k]=++dfn[0];
20     for(int i=head[k];i!=-1;i=edge[i].nex)
21         if (edge[i].to!=fa)
22             if (dfn[edge[i].to])low[k]=min(low[k],dfn[edge[i].to]);
23             else{
24                 dfs(edge[i].to,k);
25                 low[k]=min(low[k],low[edge[i].to]);
26                 if (dfn[k]<=low[edge[i].to])sum[k]++;
27             }
28 }
29 int bfs(int x,int y){
30     a.clear();
31     mat[mp(x,y)]=2;
32     q.push(mp(x,y));
33     for(int i=1;i<=V;i++)vis[i]=dfn[i]=sum[i]=0;
34     V=E=dfn[0]=0;
35     while (!q.empty()){
36         x=q.front().first;
37         y=q.front().second;
38         q.pop();
39         for(int dx=-2;dx<3;dx++)
40             for(int dy=-2;dy<3;dy++){
41                 if ((x+dx<1)||(y+dy<1)||(x+dx>n)||(y+dy>m))continue;
42                 pii o=mp(x+dx,y+dy);
43                 if (mat[o]==1){
44                     mat[o]=2;
45                     q.push(o);
46                 }
47                 if (mat[o]==2)continue;
48                 if (!a[o]){
49                     a[o]=++V;
50                     head[V]=-1;
51                     for(int dz=0;dz<4;dz++){
52                         int p=a[mp(x+dx+tx[dz],y+dy+ty[dz])];
53                         if (p){
54                             add(V,p);
55                             add(p,V);
56                         }
57                     }
58                 }
59                 if (a[o]>0)vis[a[o]]|=((-2<dx)&&(dx<2)&&(-2<dy)&&(dy<2));
60             }
61     }
62     dfs(1,0);
63     if (dfn[0]<V)return 0;
64     if ((vis[1])&&(sum[1]>1))return 1;
65     for(int i=2;i<=V;i++)
66         if ((vis[i])&&(sum[i]))return 1;
67     return 2;
68 }
69 int main(){
70     scanf("%d",&t);
71     memset(head,-1,sizeof(head));
72     while (t--){
73         scanf("%d%d%d",&n,&m,&k);
74         if (k>=1LL*n*m-1){
75             for(int i=1;i<=k;i++)scanf("%*d%*d");
76             printf("-1\n");
77             continue;
78         }
79         mat.clear();
80         for(int i=1;i<=k;i++){
81             scanf("%d%d",&x[i],&y[i]);
82             mat[mp(x[i],y[i])]=1;
83         }
84         int ans=2;
85         for(int i=1;i<=k;i++)
86             if (mat[mp(x[i],y[i])]==1)ans=min(ans,bfs(x[i],y[i]));
87         if (((n==1)||(m==1))&&(ans))ans=1;
88         if ((1LL*n*m-2==k)&&(ans))ans=-1;
89         printf("%d\n",ans);
90     }
91 }

原文地址:https://www.cnblogs.com/PYWBKTDA/p/11995812.html

时间: 2024-08-07 01:49:03

[bzoj4651]网格的相关文章

[UOJ#220][BZOJ4651][Noi2016]网格

试题描述 跳蚤国王和蛐蛐国王在玩一个游戏. 他们在一个 n 行 m 列的网格上排兵布阵.其中的 c 个格子中 (0≤c≤nm),每个格子有一只蛐蛐,其余的格子中,每个格子有一只跳蚤. 我们称占据的格子有公共边的两只跳蚤是相邻的. 我们称两只跳蚤是连通的,当且仅当这两只跳蚤相邻,或存在另一只跳蚤与这两只跳蚤都连通. 现在,蛐蛐国王希望,将某些(0 个,1 个或多个)跳蚤替换成蛐蛐,使得在此之后存在至少两只跳蚤不连通. 例如:我们用图表示一只跳蚤,用图表示一只蛐蛐,那么图 1 描述了一个 n=4,m

BZOJ4651 [Noi2016]网格/UOJ220

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description 跳蚤国王和蛐蛐国王在玩一个游戏. 他们在一个 n 行 m 列的网格上排兵布阵.其中的 c 个格子中 (0≤c≤nm),每个格子有一只蛐蛐,其余的格子中,每个格子有一只跳蚤. 我们称占据的格子有公共边的两只跳蚤是相邻的. 我们称两只跳

CSS3 网格布局(grid-layout)基础知识 - 网格模板属性(grid-template)使用说明

CSS3引入了新的网格布局(grid layout),以适应显示和设计技术的发展(尤其是移动设备优先的响应式设计). 主要目标是建立一个稳定可预料且语义正确的网页布局模式,用来替代过往表现不稳定且繁琐的table.flow以及JS脚本混合技术来实现的网页动态布局. 本文将简单而准确的介绍网格布局属性的基本概念和使用方法(摘自踏得网在线HTML5教程). 1. 概述 网格模板区域(grid-template-areas).网格模板行(grid-template-rows)和网格模板列(grid-t

在SOUI中使用网格布局

在实现网格布局前,SOUI支持两种布局形式:相对布局,和线性布局,其中线性布局是2017年2月份才支持的布局. 这两年工作都在Android这里,Android里有号称5大布局(RelativeLayout, LinearLayout, FrameLayout, GridLayout,TableLayout). FrameLayout很简单,在SOUI里一般用TabCtrl就实现了.RelativeLayout和SOUI自己的相对布局功能类似,线性布局也有了,但是一直没有实现GridLayout

任务八:响应式网格(栅格化)布局

任务目的 使用 HTML 与 CSS 实现类似 BootStrap 的响应式 12 栏网格布局,根据屏幕宽度,元素占的栏数不同. 任务描述 需要实现如 效果图 所示,调整浏览器宽度查看响应式效果,效果图中的红色的文字是说明,不需要写在 HTML 中. 任务注意事项 网格布局的作用在于更有效地控制元素在网页中所占比例的大小.比如,博客中有一个留言板模块,在比较大的屏幕上,我们希望它占了右边 25% 的宽度,在手机等比较小的屏幕上,我们希望它占 100% 的宽度,出现在博客文章下方.网格布局是一种实

GridView网格控件

一.GridView控件用于显示一个网格图像, GridView主要是用在一些相册的布局显示图片.GridView采用的是二维表的方式显示单元格,就需要设置二维表的行和列.设置GridView的列可以使用<GridView>标签的columnWidth属性.也可以使用GridView类的setColumnWidth方法来设置列数,GridView中的单元格会根据列数自动拆行显示,因此不需要设置GridView的行数,但是需要设置android:numColumns属性.否则GridView只会

CSS多列布局Multi-column、伸缩布局Flexbox、网格布局Grid详解

新css属性为我们提供了更加便捷的网页布局方式.来自微软的thomas lewis将带你认识去Grid Alignment,Flexibox Box以及Multi-column Layout这三大领域. 这篇文章最早出现在the April 2012 issue (226)这期的.net杂志上-这杂志是面向网页设计者以及开发者,全球销量最高的杂志. 按照以往来说,用CSS来布局看起来总是一样非常繁杂的工作.然而,随着一个个新标准的推出,网页设计者已经能够实现非常轻松地进行布局工作了. 主流的浏览

初学WebGL引擎-BabylonJS:第8篇-阴影网格与活动

[playground]-shadows(阴影) 源码 var createScene = function () { var scene = new BABYLON.Scene(engine); // Setup environment var camera = new BABYLON.ArcRotateCamera("Camera", 0, 0.8, 90, BABYLON.Vector3.Zero(), scene); camera.lowerBetaLimit = 0.1; c

第7章(4) GridLayout(网格布局)

分类:C#.Android.VS2015: 创建日期:2016-02-10 一.简介 Android 4.0(API 14)开始提供的GridLayout布局使用虚细线将布局划分为行.列和单元格,也支持一个控件在行.列上都有交错排列. GridLayout使用与LinearLayout类似的API,只不过是修改了一下相关的标签而已. 1.默认布局方式-先行后列 GridLayout默认按先行后列的方式依次显示,子元素默认按照wrap_content的方式显示.如果不希望子元素显式指定其所在的行列