咸鱼咕咕咕

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. Comparable接口的实现和使用

    1.什么是Comparable接口 此接口强行对实现它的每个类的对象进行整体排序.此排序被称为该类的自然排序 ,类的 compareTo 方法被称为它的自然比较方法 .实现此接口的对象列表(和数组)可 ...

  2. (Codeforce)Correct Solution?

    One cold winter evening Alice and her older brother Bob was sitting at home near the fireplace and g ...

  3. Centos内核参数优化

    关于内核参数优化 net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.ip_local_port_range = 1024 65000  net.ipv4.tcp_ ...

  4. opencv 6 图像轮廓与图像分割修复 1 查找并绘制轮廓 寻找物体的凸包

    查找并绘制轮廓 寻找轮廓(findContours)函数 绘制轮廓(drawContours()函数) 基础实例程序:轮廓查找 #include <opencv2/opencv.hpp> ...

  5. Condition对象以及ArrayBlockingQueue阻塞队列的实现(使用Condition在队满时让生产者线程等待, 在队空时让消费者线程等待)

    Condition对象 一).Condition的定义 Condition对象:与锁关联,协调多线程间的复杂协作. 获取与锁绑定的Condition对象: Lock lock = new Reentr ...

  6. 20191017-7 alpha week 2/2 Scrum立会报告+燃尽图 06

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

  7. python3 之 函数传参

    一.可变对象与不可变对象 在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象. 不可变类型:变量赋值 a=5 后 ...

  8. 爬虫json文件存储形式

    json的表现形式和python中的字典是没有很大区别的,唯一的区别是dict的键是可hash对象,而json只能是字符串. 对于json的操作可以分为两类 一是对字符串的操作: 当需要将python ...

  9. Java基础IO类之字节输入输出流

    一.IO流概述 1.IO流:输入输出流(Input/Output) 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象,即数据在设备间的传输流, 流的本质是数据传输,根据数据传输特性将 ...

  10. 【Android - 自定义View】之View的measure过程解析

    measure(测量)过程是View的工作流程中最开始.最核心的过程,在这个过程中负责确定View的测量宽/高. 对于View和ViewGroup,measure过程有不同的执行方法:如果目标是一个原 ...