HDU 4185

http://acm.hdu.edu.cn/showproblem.php?pid=4185

两个挨着的‘#‘可以配成一对,求最多能配成几对

挨着的‘#‘就连边,然后求一次最大匹配,答案是最大匹配除以二(因为1 2和2 1这两对匹配实际效果是1,但是会算成2)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
struct node{
    int s,t,nxt ;
}e[500005] ;
int m,n,head[500005],cnt,match[500005],vis[500005] ;
int find(int s)
{
    for(int i=head[s] ;i!=-1 ;i=e[i].nxt)
    {
        int tt=e[i].t ;
        if(!vis[tt])
        {
            vis[tt]=1 ;
            if(match[tt]==-1 || find(match[tt]))
            {
                match[tt]=s ;
                return 1 ;
            }
        }
    }
    return 0 ;
}
int max_match()
{
    int ans=0 ;
    memset(match,-1,sizeof(match)) ;
    for(int i=1 ;i<=m ;i++)
    {
        memset(vis,0,sizeof(vis)) ;
        ans+=find(i);
    }
    return ans;
}
void add(int s,int t) {e[cnt].s=s ;e[cnt].t=t ;e[cnt].nxt=head[s] ;head[s]=cnt++ ;}
char M[605][605] ;
int mp[605][605] ;
int dx[]={1,-1,0,0} ;
int dy[]={0,0,1,-1} ;
int main()
{
    int T ;
    scanf("%d",&T) ;
    for(int cas=1 ;cas<=T ;cas++)
    {
        int N ;
        scanf("%d",&N) ;
        for(int i=0 ;i<N ;i++)
            scanf("%s",M[i]) ;
        n=0 ;
        memset(mp,0,sizeof(mp)) ;
        for(int i=0 ;i<N ;i++)
        {
            for(int j=0 ;j<N ;j++)
            {
                if(M[i][j]==‘#‘)
                {
                    n++ ;
                    mp[i][j]=n ;
                }
            }
        }
        memset(head,-1,sizeof(head)) ;
        cnt=0 ;
        for(int i=0 ;i<N ;i++)
        {
            for(int j=0 ;j<N ;j++)
            {
                if(M[i][j]==‘#‘)
                {
                    for(int k=0 ;k<4 ;k++)
                    {
                        int xx=i+dx[k] ;
                        int yy=j+dy[k] ;
                        if(xx<0 || xx>=N || yy<0 || yy>=N)continue ;
                        if(mp[xx][yy])
                        {
                            add(mp[i][j],mp[xx][yy]) ;
                        }
                    }
                }
            }
        }
        m=n ;
        printf("Case %d: %d\n",cas,max_match()/2) ;
    }
    return 0 ;
}

HDU 4185,布布扣,bubuko.com

时间: 2024-10-13 05:59:28

HDU 4185的相关文章

hdu 4185 Oil Skimming(二分匹配)

Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 883    Accepted Submission(s): 374 Problem Description Thanks to a certain "green" resources company, there is a new profitable

HDU 4185 ——Oil Skimming——————【最大匹配、方格的奇偶性建图】

Oil Skimming Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4185 Description Thanks to a certain "green" resources company, there is a new profitable industry of oil skimming. There ar

HDU 4185 Oil Skimming

二分图的最大匹配 #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<vector> using namespace std; const int MAXN=1505; int linker[MAXN]; bool used[MAXN]; vector<int>map[MAXN]; int uN; char m[MAX

(匈牙利算法) hdu 4185

Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 993    Accepted Submission(s): 422 Problem Description Thanks to a certain "green" resources company, there is a new profitable

hdu 4185 二分图匹配

题意用1*2的木板覆盖矩阵中的‘#’,(木板要覆盖的只能是‘#’),问最多能用几个木板覆盖 将#抽象为二分图的点,一个木板就是一个匹配,注意最后结果要除以2 Sample Input 1 6 ...... .##... .##... ....#. ....## ...... Sample Output Case 1: 3 1 #include<stdio.h> 2 #include<string.h> 3 const int MAXN=1000; 4 char map[610][6

G - Oil Skimming - hdu 4185(二分图匹配)

题意:在大海里有一些石油 ‘#’表示石油, ‘.’表示水,有个人有一个工具可以回收这些石油,不过只能回收1*2大小的石油块,里面不能含有海水,要不就没办法使用了,求出来最多能回收多少块石油 分析:先把数据处理一下,给每一点石油都进行编号,然后查找一下四周联合是否能组成石油块,能的话就连接,因为一点有可能即在左边又在右边,所以最后的结果应该除去 2 ************************************************************************* #

HDU 4185 Oil Skimming(离散化 + 二分图匹配)

#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cmath> #include <algorithm> #define LL long long #define FOR(i,

Oil Skimming HDU - 4185(匹配板题)

Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3426    Accepted Submission(s): 1432 Problem Description Thanks to a certain "green" resources company, there is a new profitabl

Oil Skimming HDU - 4185

匈牙利 #include <iostream> #include <cstdio> #include <cstring> using namespace std; char mp[660][660]; int g[660][660]; int relate[660][660]; int match[660]; int vis[660]; int k,n; int tmp; int dfs(int u){ int i; for(i = 0; i < tmp; i++