Face questions
https://www.luogu.org/problem/P1971
answer
// luogu-judger-enable-o2 #include<cstdio> #include<cstring> #include<iostream> #include<vector> #include<queue> #define ri register int #define N 42 using namespace std; inline int read() { int f=0,ret=0; char ch=getchar(); while (ch<'0' || ch>'9') f|=(ch=='-'),ch=getchar(); while (ch>='0'&& ch<='9') ret=ret*10+(ch-'0'),ch=getchar(); return f?-ret:ret; } int T,n,m,k; vector<int> to[N*N]; int match[N*N],vis[N*N],tin; char g[N][N]; bool ban[N*N]; int S[N*N]; int x[N*N],y[N*N]; const int dx[]={-1,0,1,0},dy[]={0,-1,0,1}; void add_edge(int x,int y) { to[x].push_back(y); to[y].push_back(x); } bool dfs(int x) { if (ban[x]) return 0; for (ri i=0;i<to[x].size();i++) { int y=to[x][i]; if (vis[y]==tin || ban[y]) continue; vis[y]=tin; if (!match[y] || dfs(match[y])) { match[y]=x; match[x]=y; return 1; } } return 0; } int id(int x,int y) {return (x-1)*m+y;} bool isnec(int x) { ban[x]=1; if (!match[x]) return 0; int y=match[x]; match[x]=match[y]=0; ++tin; return 1^dfs(y); } int main() { scanf("%d %d",&n,&m); memset(g,'#',sizeof(g)); for (ri i=1;i<=n;i++) scanf("%s",g[i]+1),g[i][m+1]='#'; for (ri i=1;i<=n;i++) { for (ri j=1;j<=m;j++) if (g[i][j]=='O') { for (ri opt=0;opt<4;opt++) { int u=i+dx[opt],v=j+dy[opt]; if (g[u][v]=='.' || g[u][v]=='X') add_edge(id(i,j),id(u,v)); } } else if (g[i][j]=='.') x[0]=i,y[0]=j; } for (ri i=1;i<=n;i++) for (ri j=1;j<=m;j++) if (g[i][j]=='O') ++tin,dfs(id(i,j)); scanf("%d",&k); for (ri i=1;i<=2*k;i++) scanf("%d %d",&x[i],&y[i]); int top=0; for (ri i=1;i<=k;i++) { int t1=isnec(id(x[2*i-2],y[2*i-2])); int t2=isnec(id(x[2*i-1],y[2*i-1])); if (t1 && t2) S[++top]=i; } printf("%d\n",top); for (ri i=1;i<=top;i++) printf("%d\n",S[i]); return 0; }