zoukankan      html  css  js  c++  java
  • hdu4185 Oil Skimming

    题意:抽象出模型: 用1*2的木板覆盖矩阵中的‘#’,(木板要覆盖的只能是‘#’),问最多能用几个木板覆盖

    分析:很典型的二分匹配问题,将矩阵中的点分成俩种,下标i+j为奇数和偶数俩种,即把矩阵当成一个黑白棋盘,那么,一个木板只能覆盖一个黑色和一个白色格子,将黑色格子(并且是‘#’的格子)跟相邻的白色(并且是‘#’)的格子连一条边,则变成了一个求最大匹配的问题了

    点数太多,可以将棋盘上的点hash一下

    View Code
    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    const int N = 3600+10;
    int n,num1,num2,my[N],hash1[601][601];
    char map[601][601];
    bool vis[N];
    vector<int> g[N];
    int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    int path(int u)
    {
    vector<int>::iterator it=g[u].begin();
    for(;it!=g[u].end();it++)
    {
    int v=*it;
    if(!vis[v])
    {
    vis[v]=true;
    if(my[v]==-1 || path(my[v]))
    {
    my[v]=u;
    return 1;
    }
    }
    }
    return 0;
    }
    int main()
    {
    int T,cas=0;
    scanf("%d",&T);
    while(T--)
    {
    scanf("%d",&n);
    num1=num2=0;
    for(int i=0;i<n;i++)
    {
    scanf("%s",map[i]);
    for(int j=0;j<n;j++)
    {
    if(map[i][j]=='#')
    if((i+j)&1)
    hash1[i][j]=num1++;
    else hash1[i][j]=num2++;
    }
    }
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    if(((i+j)&1) && map[i][j]=='#')//将这类棋子跟相邻是‘#’的格子相连
    for(int k=0;k<4;k++)
    {
    int x=dir[k][0]+i;
    int y=dir[k][1]+j;
    if(x<0 || x>=n || y<0 || y>=n || map[x][y]!='#')
    continue;
    g[hash1[i][j]].push_back(hash1[x][y]);
    }
    int ans=0;
    memset(my,-1,sizeof(my));
    for(int i=0;i<num1;i++)
    {
    memset(vis,false,sizeof(vis));
    ans+=path(i);
    }
    printf("Case %d: %d\n",++cas,ans);
    for(int i=0;i<num1;i++)
    g[i].clear();
    }
    return 0;
    }
  • 相关阅读:
    深度学习中的Data Augmentation方法(转)基于keras
    caffe pytho接口
    finetuning caffe
    windows下配置Faster-RCNN
    caffe中的props
    centos上搭建git服务--3
    centos上搭建git服务--2
    Centos上搭建git服务
    loadrunner--基础2
    loadrunner11--基础使用
  • 原文地址:https://www.cnblogs.com/nanke/p/2427656.html
Copyright © 2011-2022 走看看