• 【NOI2011】兔兔与蛋蛋游戏


    题面

    https://www.luogu.org/problem/P1971

    题解

    // 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
    ",top);
      for (ri i=1;i<=top;i++) printf("%d
    ",S[i]);
      return 0;
    }
  • 相关阅读:
    3.live555源码分析----延时队列
    RTP包的结构
    2.live555源码分析----服务端doEventLoop()函数分析
    1.live555源码分析----RSTPServer创建过程分析
    RTSP协议介绍 (转)
    搭建最简单的流媒体系统(服务器和客户端)
    谈一谈 MPU6050 姿态融合(转)
    Nginx的优化
    LAMP与LNMP加速与缓存优化
    Nginx在LNMP架构中的作用与虚拟主机配置
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11278635.html
Copyright © 2020-2023  润新知