题意:在大海里有一些石油 ‘#’表示石油, ‘.’表示水,有个人有一个工具可以回收这些石油,不过只能回收1*2大小的石油块,里面不能含有海水,要不就没办法使用了,求出来最多能回收多少块石油
分析:先把数据处理一下,给每一点石油都进行编号,然后查找一下四周联合是否能组成石油块,能的话就连接,因为一点有可能即在左边又在右边,所以最后的结果应该除去 2
*************************************************************************
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; const int MAXN = 40005;///处理后点的个数
const int MAXM = 605;///原图大小
const int oo = 1e9+7; char G[MAXM][MAXM]; int N;///保存原图
int  Index[MAXM][MAXM];///给石油点编号 struct Edge{int v, next;}e[MAXN*4];
int Head[MAXN], cnt;///处理后的边 int Mx[MAXN], My[MAXN];///记录与之匹配的点
int used[MAXN], dx[MAXN], dy[MAXN];///dx,dy记录BFS后的层次
int depth, NX;///宽搜的深度,和点的个数 void InIt()
{///初始化
    NX = cnt = 0;     memset(Head, -1, sizeof(Head));
    memset(Mx, false, sizeof(Mx));
    memset(My, false, sizeof(My));
}
void AddEdge(int u, int v)
{///添加边
    e[cnt].v = v;
    e[cnt].next = Head[u];
    Head[u] = cnt++;
}
bool BFS()
{///广搜求出层次,并且判断是否有增广路存在
    queue<int> Q;
    depth = oo;     memset(dx, false, sizeof(dx));
    memset(dy, false, sizeof(dy));     for(int i=1; i<=NX; i++)
    {
        if( Mx[i] == false )
        {
            dx[i] = true;
            Q.push(i);
        }
    }     while(Q.size())
    {
        int u = Q.front(); Q.pop();         if( dx[u] > depth )break;///已经发现上层存在增广路         for(int j=Head[u]; j!=-1; j=e[j].next)
        {
            int v = e[j].v;
            if( dy[v] == false )
            {
                dy[v] = dx[u] + 1;                 if(My[v] == false)
                    depth = dy[v];
                else
                {
                    dx[ My[v] ] = dy[v] + 1;
                    Q.push( My[v] );
                }
            }
        }
    }     return depth != oo;
}
bool DFS(int i)
{
    for(int j=Head[i]; j!=-1; j=e[j].next)
    {
        int v = e[j].v;         if( used[v] == false && dx[i] == dy[v]-1 )
        {
            used[v] = true;///开始忘记置为true,错了一次
            
            if( My[v] && dy[v] == depth )
                continue;
            if( !My[v] || DFS(My[v]))
            {
                My[v] = i;
                Mx[i] = v;                 return true;
            }
        }
    }     return false;
}
int  Karp()
{
    int ans = 0;     while( BFS() == true )
    {
        memset(used, false, sizeof(used));
        for(int i=1; i<=NX; i++)
        {
            if( !Mx[i] && DFS(i) )
                ans++;
        }
    }     ///因为点同时在两边,所以会重复一次,结果应该出去 2
    return ans / 2;
} int main()
{
    int i, j, T, t=1;     scanf("%d", &T);     while(T--)
    {
        scanf("%d", &N);         InIt();         for(i=0; i<N; i++)
        {
            scanf("%s", G[i]);
            for(j=0; j<N; j++)
            {
                if(G[i][j] == '#')
                {///购置关系图
                    Index[i][j] = ++NX;///给石油编号                     if(j != 0 && G[i][j-1] == '#')
                    {///与左边的可以匹配
                        AddEdge(Index[i][j], Index[i][j-1]);
                        AddEdge(Index[i][j-1], Index[i][j]);
                    }                     if(i != 0 && G[i-1][j] == '#')
                    {///与上面的可以匹配
                        AddEdge(Index[i][j], Index[i-1][j]);
                        AddEdge(Index[i-1][j], Index[i][j]);;
                    }
                }
            }
        }         int ans = Karp();         printf("Case %d: %d\n", t++, ans);
    }     return 0; } 

G - Oil Skimming - hdu 4185(二分图匹配)的更多相关文章

  1. Oil Skimming HDU - 4185(匹配板题)

    Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  2. (匹配)Oil Skimming -- hdu --4185

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4185 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  3. hdu 4185 二分图匹配

    题意用1*2的木板覆盖矩阵中的‘#’,(木板要覆盖的只能是‘#’),问最多能用几个木板覆盖 将#抽象为二分图的点,一个木板就是一个匹配,注意最后结果要除以2 Sample Input 1 6 .... ...

  4. hdu 1281 二分图匹配

    题目:在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下.但是某些格子若不放子,就 无法保证放尽量多的“车”,这样的格子被称做重要点 ...

  5. hdu 2063 二分图匹配

    题意:一些女的和一些男的有好感,有好感的能一起坐过山车,问最多能组成多少对 hdu 11 页上少有的算法题,二分图匹配问题,匈牙利算法,对于每一个汉子,看和他有好感的妹子有没有配对了,没有配对过就可以 ...

  6. hdu 4185 二分图最大匹配

    Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  7. hdu 1507(二分图匹配)

    Uncle Tom's Inherited Land* Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  8. 过山车 HDU 2063 (二分图匹配裸题)

    Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生 ...

  9. Land of Farms HDU - 5556 二分图匹配

    Farmer John and his brothers have found a new land. They are so excited and decide to build new farm ...

随机推荐

  1. 500 OOPS: vsftpd: refusing to run with writable root inside chroot()解决方法

    vsftpd.conf配置文件如下: [root@rusky ~]# cat /etc/vsftpd/vsftpd.conf | grep -v "#" anonymous_ena ...

  2. 在Linux上怎么安装和配置Apache Samza

    samza是一个分布式的流式数据处理框架(streaming processing),它是基于Kafka消息队列来实现类实时的流式数据处理的.(准确的说,samza是通过模块化的形式来使用kafka的 ...

  3. My.Ioc 代码示例——谈一谈如何实现装饰器模式,兼谈如何扩展 My.Ioc

    装饰器模式体现了一种“组合优于继承”的思想.当我们要动态为对象增加新功能时,装饰器模式往往是我们的好帮手. 很多后期出现的 Ioc 容器都为装饰器模式提供了支持,比如说 Autofac.在 My.Io ...

  4. mssql sql高效关联子查询的update 批量更新

    /* 使用带关联子查询的Update更新     --1.创建测试表 create TABLE Table1     (     a varchar(10),     b varchar(10),   ...

  5. drop table xx purge

    drop table xx purge; 说明: 所有删除的表都会在回收站里面,只有后面加上purge才是彻底的清空表. (一般用于测试.练习数据表,所以最好不要带purge,要不误删就找不到了.)

  6. 微信 token 验证

    package org.sxl.weixin; import java.security.MessageDigest; import java.security.NoSuchAlgorithmExce ...

  7. .net中XML的创建02(linqToXml)

    linqToXml比较的灵活和方便,它是基于函数式编程具体的使用如下:引用程序集using System.Xml.Linq; 1.创建XDocument并设置文档头  XDocument XDoc = ...

  8. Web学习资源及手册查询整理

    入门了解html.css.js.jQuery:http://www.w3school.com.cn/, bootstrap.nodejs.php.jQuery入门:http://www.runoob. ...

  9. [转]delphi 删除动态数组的指定元素

    type TArr = array of TPoint; {把数组先定义成一个类型会方便许多, 这里仅用 TPoint 测试} {删除动态数组指定元素的过程: 参数 arr 是数组名, 参数 Inde ...

  10. LXPanel自定义添加应用程序到快速启动栏

    LXPanel是Linux下LXDE项目的一个桌面面板软件.我一开始接触的时候,对于自己自定义的程序到快速启动栏绕了很多弯路,这里记录下,防止以后自己忘了.还有一点就是很多时候,panel下的应用程序 ...