这是QZEZ的Luogu团队中的一道可贵的水题,题面和数据都是CJJ dalao出的,而后我就没有太看懂题意。git
也是一道经典的割点好题,但须要必定的思惟。ui
首先对于题意,它只须要获得切断的做用就能够了(将\(1\)的联通快分红几部分便可)spa
而后咱们就能够对周围的点都进行建边,而后跑一下看看有没有割点。code
有的话很明显,随便找一个割点一道切掉便可。但若是没有呢?string
据CJJ dalao和个人一阵讨论发现这时候就只须要割掉两个点便可。it
例如相似这样的一个图:io
1 1 1class
1 0 1next
1 1 1数据
咱们在割去一边上的任意一个点时就会出现割点。不知道是什么性质。
而后莫名就过了。
CODE
#include<cstdio> #include<cctype> #include<cstring> using namespace std; const int N=305,fx[4]={0,1,0,-1},fy[4]={1,0,-1,0}; struct edge { int to,next; }e[N*N<<3]; int head[N*N],father[N*N],low[N*N],dfn[N*N],cnt,tot,ans,t,n,m,g[N][N]; bool cut[N*N]; inline char tc(void) { static char fl[100000],*A=fl,*B=fl; return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++; } inline void read(int &x) { x=0; char ch; while (!isdigit(ch=tc())); while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc())); } inline void add(int x,int y) { e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt; } inline int min(int a,int b) { return a<b?a:b; } inline void clear(void) { memset(e,-1,sizeof(e)); memset(head,-1,sizeof(head)); memset(low,0,sizeof(low)); memset(dfn,0,sizeof(dfn)); memset(father,0,sizeof(father)); memset(cut,0,sizeof(cut)); cnt=ans=0; } inline void build(int x,int y) { for (register int i=0;i<4;++i) { int xx=x+fx[i],yy=y+fy[i]; if (xx>0&&yy>0&&xx<=n&&yy<=m&&g[xx][yy]) add((x-1)*m+y,(xx-1)*m+yy); } } inline void Tarjan(int now) { dfn[now]=low[now]=++tot; int res=0; for (register int i=head[now];i!=-1;i=e[i].next) if (!dfn[e[i].to]) { father[e[i].to]=now; ++res; Tarjan(e[i].to); low[now]=min(low[now],low[e[i].to]); if (father[now]&&low[e[i].to]>=dfn[now]) !cut[now]&&(cut[now]=1,++ans); } else if (e[i].to!=father[now]) low[now]=min(low[now],dfn[e[i].to]); if (!father[now]&&res>=2) !cut[now]&&(cut[now]=1,++ans); } int main() { //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); register int i,j; read(t); while (t--) { clear(); read(n); read(m); for (i=1;i<=n;++i) for (j=1;j<=m;++j) read(g[i][j]); for (i=1;i<=n;++i) for (j=1;j<=m;++j) if (g[i][j]) build(i,j); for (i=1;i<=n*m;++i) if (!dfn[i]) Tarjan(i); puts(ans?"1":"2"); } return 0; }