1 条题解
-
0

#include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; const int M = 10000005; #define pb push_back int read() { int x=0,f=1;char c; while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;} while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();} return x*f; } int T,n,m,c,q,t,cnt,zxy,dfn[M],low[M]; vector<int> g[M]; struct node {int x,y,t;}a[M]; bool cmp1(node a,node b) { if(a.x==b.x && a.y==b.y) return a.t<b.t; if(a.x==b.x) return a.y<b.y; return a.x<b.x; } bool cmp2(node a,node b) { return a.y==b.y?a.x<b.x:a.y<b.y; } void add(int x,int y,int dx,int dy) { for(int i=-dx;i<=dx;i++) for(int j=-dy;j<=dy;j++) { int tx=x+i,ty=y+j; if(tx>=1 && tx<=n && ty>=1 && ty<=m) a[++t]={tx,ty,0}; } } void dfs(int u,int fa) { dfn[u]=low[u]=++cnt;int son=0; for(int v:g[u]) { if(!dfn[v]) { dfs(v,u); low[u]=min(low[u],low[v]); if(low[v]>=dfn[u]) { if(fa) zxy=1; else son++; } } else if(v!=fa) low[u]=min(low[u],dfn[v]); } if(son>1) zxy=1; } void work() { n=read();m=read();c=read();q=t=0; for(int i=1;i<=c;i++) { int x=read(),y=read(); add(x,y,1,1); add(1,y,0,0);add(n,y,0,0); add(x,1,0,0);add(x,m,0,0); a[++t]={x,y,-1}; } add(1,1,2,2);add(1,m,2,2);add(n,1,2,2);add(n,m,2,2); sort(a+1,a+1+t,cmp1);int pt=0;node ls; for(int i=1;i<=t;i++) if(ls.x!=a[i].x || ls.y!=a[i].y) ls=a[i],a[++pt]=ls; t=pt;cnt=zxy=0; for(int i=1;i<=t;i++) if(a[i].t!=-1) a[i].t=++q; for(int i=1;i<=q;i++) dfn[i]=low[i]=0,g[i].clear(); for(int i=2;i<=t;i++) if(a[i].x==a[i-1].x && a[i].t!=-1 && a[i-1].t!=-1) g[a[i].t].pb(a[i-1].t),g[a[i-1].t].pb(a[i].t); sort(a+1,a+1+t,cmp2); for(int i=2;i<=t;i++) if(a[i].y==a[i-1].y && a[i].t!=-1 && a[i-1].t!=-1) g[a[i].t].pb(a[i-1].t),g[a[i-1].t].pb(a[i].t); if(q<=1 || (q<=2 && !g[1].empty())) { puts("-1"); return ; } dfs(1,0); if(cnt<q) puts("0"); else puts(zxy?"1":"2"); } signed main() { T=read(); while(T--) work(); }
- 1
信息
- ID
- 6316
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者