[NOI2011] Bunny and Egg game

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;
}

 

Guess you like

Origin www.cnblogs.com/shxnb666/p/11278635.html