咸鱼咕咕咕

Time Limit: 1000 MS     Memory Limit: 64 MB
Submit Status

咸鱼有个咕咕笼。

咕咕笼可以划分成m×nm×n个格子,每个小格子可以放下一只咕咕,也可以放下一个咕咕槽。

现在咕咕笼里有若干只咕咕

放在咕咕笼里的咕咕能够看到他上下左右四个方向上的所有格子。

当然,因为咕咕槽比较高,那群咕咕没办法看见咕咕槽后面的咕咕

咸鱼发现如果两只咕咕能够看见对方,他们会在咸鱼离开的时候跑在一起形成更大的咕咕咕咕,否则他们只会像条咸鱼一样安心待在那里咕咕。

现在咸鱼不希望他们形成咕咕咕咕,需要带走一些咕咕

但是带走太多的咕咕会让咸鱼咕咕咕咕。

咸鱼希望你能帮他决定至少应该带走多少只咕咕

Input

第一行两个整数mm,nn。(1≤m,n≤50)(1≤m,n≤50)

接下来mm行,每行一个字符串,含有nn个字符。

第ii个字符串第jj个字符表示了咕咕笼第ii行第jj列的情况。

若字符为o,表示这上面有只咕咕

若字符为+,表示这上面有个咕咕槽。

若字符为.,表示上面既没有咕咕,也没有咕咕槽。

Output

输出咸鱼至少应该带走多少只咕咕

Sample input and output

Sample Input Sample Output
2 2
o+
.o
0
2 5
o+.o+
.o..o
1
1 1
.
0

Hint

Sample 1: 不需要带走咕咕

Sample 2: 至少需要带走(2,2)(2,2)或(2,5)(2,5)其中一只咕咕,不然他们会在咸鱼离开后变成咕咕咕咕

Sample 3: 没有咕咕可带。

题解:

这一题最主要的就是建图,我们可以这么考虑,如果同一行中的两个咕咕之间存在咕咕槽,则把他们当做不同行去处理,如果同一列中的两个咕咕之间存在咕咕槽,则把他们当做不同列去处理。然后行作为一个集合,列作为一个集合,做二分图匹配,最终答案则是咕咕数减去最大匹配数。

为什么可以这么做呢?因为如果某一行中没有咕咕槽的话,那么这一行只允许存在一个咕咕(因为如果存在两个或两个以上的咕咕会形成咕咕咕咕),对于列也是如此。如果有咕咕槽,咕咕槽两边的咕咕可以同时存在于同一行或同一列,为了转化为二分图匹配的问题,我们就可以把他们当成不同行或不同列。二分图最大匹配就可以求出最终矩阵中最多可以放置多少个咕咕且不会形成咕咕咕咕。

AC代码为:

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5;
char s[1000][1000];
int n,m,o,p,sum,num,i,j,k,kk,q,ii,e[maxn],f[maxn],c[maxn],d[maxn],a[maxn],b[maxn],link[2555][2555],girl[10000],used[10000];
bool found(int x)
{
    for (int i=1;i<=kk;i++)
    if (link[x][i]&&!used[i])
    {
        used[i]=1;
       if (girl[i]==0||found(girl[i]))
       {
           girl[i]=x;
           return(1);
       }
    }
    return(0);
}

int main()
{
    cin>>m>>n;
    for (i=1;i<=m;i++)
        cin>>s[i];
    o=0;
    for (i=1;i<=m;i++)
    {
        for (j=0;j<=n-1;j++)
        if (s[i][j]=='o')
        {
            p=0; q=0;
            for (ii=0;ii<j;ii++)
                if (s[i][ii]=='+') p++;
            for (ii=1;ii<i;ii++)
                if (s[ii][j]=='+') q++;
            o+=1;
            a[o]=i+p*m;
            b[o]=j+1+q*n;
        }
    }
    for (i=1;i<=o;i++)
    {
        e[i]=a[i];
        f[i]=b[i];
    }
    sort(a+1,a+1+o);
    sort(b+1,b+1+o);
    c[a[1]]=1;
    k=1;
    for (i=2;i<=o;i++)
    if (a[i]==a[i-1]) c[a[i]]=k; else {k++;c[a[i]]=k;}
    d[b[1]]=1;
    kk=1;
    for (i=2;i<=o;i++)
    if (b[i]==b[i-1]) d[b[i]]=kk; else {kk++;d[b[i]]=kk;}
    for (i=1;i<=o;i++)
    link[c[e[i]]][d[f[i]]]=1;
    for (i=1;i<=kk;i++)
    girl[i]=0;
    num=0;
    for (i=1;i<=k;i++)
    {
        memset(used,0,sizeof(used));
        if (found(i)) num++;
    }
    printf("%d\n",o-num);
    return(0);
}

UESTC-1963咸鱼咕咕咕(二分图匹配)的更多相关文章

  1. UESTC 898 方老师和缘分 --二分图匹配+强连通分量

    这题原来以为是某种匹配问题,后来好像说是强连通的问题. 做法:建图,每个方老师和它想要的缘分之间连一条有向边,然后,在给出的初始匹配中反向建边,即如果第i个方老师现在找到的是缘分u,则建边u-> ...

  2. u-boot for tiny210 ver1.0(by liukun321咕唧咕唧)

     新版本下载: 下面的链接提供了较新版本的源码 ver4.0源码下载:u-boot for tiny210 ver4.0 ver3.1源码下载: u-boot for tiny210 ver3.1 v ...

  3. (转)S5pv210 HDMI 接口在 Linux 3.0.8 驱动框架解析 (By liukun321 咕唧咕唧)

    作者:liukun321 咕唧咕唧 日期:2014.1.18 转载请标明作者.出处:http://blog.csdn.net/liukun321/article/details/18452663 本文 ...

  4. UVA 12549 - 二分图匹配

    题意:给定一个Y行X列的网格,网格种有重要位置和障碍物.要求用最少的机器人看守所有重要的位置,每个机器人放在一个格子里,面朝上下左右四个方向之一发出激光直到射到障碍物为止,沿途都是看守范围.机器人不会 ...

  5. POJ 1274 裸二分图匹配

    题意:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶,告诉每头奶牛愿意产奶的牛棚编号,求出最多能分配到的牛栏的数量. 分析:直接二分图匹配: #include<stdio.h> #includ ...

  6. BZOJ1433 ZJOI2009 假期的宿舍 二分图匹配

    1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2375  Solved: 1005[Submit][Sta ...

  7. HDU1281-棋盘游戏-二分图匹配

    先跑一个二分图匹配,然后一一删去匹配上的边,看能不能达到最大匹配数,不能这条边就是重要边 /*----------------------------------------------------- ...

  8. HDU 1083 网络流之二分图匹配

    http://acm.hdu.edu.cn/showproblem.php?pid=1083 二分图匹配用得很多 这道题只需要简化的二分匹配 #include<iostream> #inc ...

  9. hdu 5727 Necklace dfs+二分图匹配

    Necklace/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5727 Description SJX has 2*N mag ...

随机推荐

  1. [干货]AspNetCore熟练应用CancellationToken,CTO会对你刮目相看

    背景 已经有很多文章记录了 web程序中采用异步编程的优势和.Net异步编程的用法, 异步编程虽然不能解决查询数据库的瓶颈, 但是利用线程切换,能最大限度的弹性利用工作线程, 提高了web服务的响应能 ...

  2. Download-学习资源下载

    小白求关爱:链接为本人工作中学习所碰到的,如有不对之处,请及时联系加以改正,后续仍会追加新链接地址并及时更新旧链接地址 Jdk历史版本 https://www.oracle.com/technetwo ...

  3. GitHub和Git

    GitHub托管项目代码 首先一些基本概念: repository(仓库) 用来存放项目代码,每个项目代表一个仓库,开一个项目就意味着你有一个仓库. star(收藏) 收藏方便下次查找. fork(复 ...

  4. 逻辑卷LVM

    1.理解LVM http://www.cnblogs.com/gaojun/archive/2012/08/22/2650229.html 2.创建LVM 根据“理解LVM”提供的原理思路搞 a)建立 ...

  5. root权限后,不要忘了还有selinux

    下面的例子运行在中兴android 5.0手机上. 当我们使用root权限的python去创建socket监听端口8088时,selinux向kmsg输出了下面的记录 python-android5 ...

  6. vue项目中安装使用vux

    vux是个vue的移动端框架. 目前移动端UI框架这么多,为啥选择vux呢?vux虽然说是个个人维护项目,但是有15000+个star,应该不比其他的团队开源框架差. 最重要的是,目前要做微信公众号和 ...

  7. PostGIS 结合Openlayers以及Geoserver实现最短路径分析(三)

    接上篇,前面在ArcMap中和Postgis中将数据都已经进行了预处理. 接下来回到Geoserver中,进行数据发布. 1.新建工作区 2.填写完工作区信息 3.打开数据存储,添加新的数据存储 4. ...

  8. 扛把子组20191107-4 beta week 2/2 Scrum立会报告+燃尽图 03

    此作业的要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9956 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩 ...

  9. 20191107-3 beta week 2/2 Scrum立会报告+燃尽图 02

    此作业要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/9955] 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 ...

  10. element 根据某一个属性合并列

    通过 span-method 绑定方法 objectSpanMethod方法 this.getSpanArr(this.tableData); //this.tableData 指接口取到的数据 // ...