zoukankan      html  css  js  c++  java
  • TYVJ 1035 / codevs 2171 棋盘覆盖

    Problem Description

    给定一个n * m的棋盘,已知某些各自禁止放置,求最多往棋盘上放多少长度为2宽度为1的骨牌(骨牌不重叠)

    Input

    第一行为n,m(表示有m个删除的格子)
    第二行到m+1行为x,y,分别表示删除格子所在的位置
    x为第x行
    y为第y列

    output

    一个数,即最大覆盖格数

    思路:对于棋盘覆盖问题,就是把棋盘拆成各个点然后根据题意把能被一张骨牌覆盖的点连边……然后就可以发现每个横纵坐标之和为奇数的点为左部节点,和为偶数的为右部节点,然后跑最大匹配就可以了

      也就是把棋盘两两不相邻地进行黑白染色 然后黑色为左部节点,白色为右部节点,依据题意连边

      类似的套路题还有网络流24题中的方格取数问题和骑士共存问题,建模时都是先黑白染色然后连边……

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 11000;
    int g[N], col[N];
    int n,m,mat[N];
    bool vis[N],er[110][110];
    
    int head[N],now;
    struct edges{
        int to,next;
    }edge[N<<1];
    void add(int u,int v){  edge[++now] = {v,head[u]}; head[u] = now;}
    
    int id(int x,int y){
        return (x - 1) * n + y;
    }
    
    bool dfs(int x){
        for(int i = head[x]; i; i = edge[i].next){
            int v = edge[i].to;
            if(!vis[v]){
                vis[v] = 1;
                if(!mat[v] || dfs(mat[v])){
                    mat[v] = x;
                    return 1;
                }
            }
        }
        return 0;
    }
    
    int main(){
        scanf("%d%d",&n,&m);
        int a,b;
        for(int i = 1; i <= m; i++){
            scanf("%d%d",&a,&b);
            er[a][b] = 1;
        }
        for(int i = 1; i <= n; i++)
          for(int j = 1; j <= n; j++){
            if(er[i][j] || (i+j) % 2 == 0) continue;
            if(j > 1 && !er[i][j-1]) add(id(i,j), id(i,j-1));
            if(i > 1 && !er[i-1][j]) add(id(i,j), id(i-1,j));
            if(j < n && !er[i][j+1]) add(id(i,j), id(i,j+1));
            if(i < n && !er[i+1][j]) add(id(i,j), id(i+1,j));
          }
        int ans = 0;
        for(int i = 1; i <= n; i++)
          for(int j = 1; j <= n; j++){
            memset(vis,0,sizeof(vis));
            if(dfs(id(i,j))) 
              ans++; 
          }
    //    cout<<now<<endl;
        printf("%d
    ",ans);
        return 0; 
    }
  • 相关阅读:
    Infosec institute n00bs CTF writeup
    CTF学习之CODE
    ThinkPHP函数详解:C方法
    流程控制的替代语法
    Jquery DOM
    YII2 请求(request)
    YII2 运行概述(Overview)
    YII2 小部件(widgets)
    YII2 过滤器 filters
    YII2 随笔 视图最佳实践
  • 原文地址:https://www.cnblogs.com/Rorshach/p/8682841.html
Copyright © 2011-2022 走看看