HDU-1498-50years,50colors(最大匹配, 枚举)

HDU-1498-50years,50colors(最大匹配, 枚举)

链接:https://vjudge.net/problem/HDU-1498#author=634579757

题意:

撞气球游戏,一个n*n的矩阵中,有不同颜色的气球,气球的颜色最多50种(从1到50)。 
游戏开始前,先选择一种颜色。游戏开始后,每次选择一行或者一列包含该种颜色的气球进行撞击。如果选择行,那么这一行的气球都会炸裂。如果选择列,这一列的气球都炸裂。 
请你求出,有多少种颜色的气球,无论怎么玩,都不能在K次之内,把所有同色的气球都撞裂。

思路:

二分图匹配, 用set记录所有存在的颜色,然后根据x,y求最大匹配,条件是Map[i][j] == color。

最大匹配大于k即可。

代码:

#include <iostream>
#include <memory.h>
#include <string>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <algorithm>
#include <map>
#include <queue>
#include <math.h>
#include <cstdio>
#include <set>
#include <iterator>
#include <cstring>
using namespace std;

typedef long long LL;
const int MAXN = 2000+10;
vector<int> G[MAXN];
int Map[200][200];
int Link[MAXN], Vis[MAXN];
int n, m, k;
int mid;

void Init()
{
    for (int i = 1;i <= n;i++)
        G[i].clear();
}

bool Dfs(int x)
{
    for (int i = 1;i <= n;i++)
    {
        if (Map[x][i] == mid && Vis[i] == 0)
        {
            Vis[i] = 1;
            if (Link[i] == -1 || Dfs(Link[i]))
            {
                Link[i] = x;
                return true;
            }
        }
    }
    return false;
}

int Solve()
{
    memset(Link, -1, sizeof(Link));
    int cnt = 0;
    for (int i = 1;i <= n;i++)
    {
        memset(Vis, 0, sizeof(Vis));
        if (Dfs(i))
            cnt++;
    }
    return cnt;
}

int main()
{
    while (~scanf("%d%d", &n, &m) && n)
    {
        set<int> node;
        memset(Map, 0, sizeof(Map));
        for (int i = 1;i <= n;i++)
        {
            for (int j = 1;j <= n;j++)
            {
                cin >> Map[i][j];
                node.insert(Map[i][j]);
            }
        }
        vector<int> Out;
        for (set<int>::iterator it = node.begin();it != node.end();it++)
        {
            mid = *it;
            int tmp = Solve();
            if (tmp > m)
                Out.push_back(mid);
        }
        if (!Out.size())
            cout << -1 << endl;
        else
        {
            cout << Out[0];
            for (int i = 1;i < Out.size();i++)
                cout << ' ' << Out[i];
            cout << endl;
        }
    }

    return 0;
}

  

转载于:https://www.cnblogs.com/YDDDD/p/10870344.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100920.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • http的幂等性[通俗易懂]

    一.什么是幂等性幂等(idempotent):在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同.幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的.更复杂的操作幂等保证是利用唯一交易号(流水号)实

    2022年4月17日
    63
  • HDU 5651 xiaoxin juju needs help 数学

    HDU 5651 xiaoxin juju needs help 数学

    2021年9月13日
    44
  • 图像的卷积操作

    图像的卷积操作原理:给定一个奇数尺寸大小的卷积核,对图像进行卷积操作。因为使用奇数尺寸大小的卷积核,其锚点正好在卷积核正中央的位置。如下图中间画了一个锚的就是锚点使锚点覆盖在待计算像素上面,然后计算像素值与被覆盖的卷积核中的值的乘积和。将这个和赋值给当前像素,这就是卷积的过程。公式如下所示此处会有一个问题,如果锚点落在第一个像素点(1,1)上,卷积核当中锚点左侧和上方的卷积值超出了图像的边界外…

    2022年5月27日
    52
  • 按位异或运算符的讲解 (详细)

    按位异或运算符的讲解 (详细)按位异或运算按位异或运算是数学或者计算机中运用到的数据处理的方法。感觉是一种思路,当然也是运用到了他的原理。异或运算首先异或表示当两个数的二进制表示,进行异或运算时,当前位的两个二进制表示不同则为1,相同则为0.改方法被广泛用来统计一个数的1的位数。即:0^0=0,0^1=1,1^0=1,1^1=0,按位异或的3个特点:1.)0^0=0,0^1=1,0异或任何数=任何数。2.)1^0=1,1^1=

    2022年6月5日
    58
  • USB转RS485串口电路设计「建议收藏」

    USB转RS485串口电路设计「建议收藏」USB转串口芯片的串口信号一般为TTL/CMOS电平,在实现半双工RS485串口时需要外接485电平转换芯片,设计中需要有信号来控制485转接芯片的发送和接收使能端,建议选择自带485控制引脚的转接芯片(如CH340/CH342系列芯片的TNOW引脚),该引脚默认为低电平,当串口处于发送状态时会自动拉高处于有效状态,发送完成再恢复低电平。同理,可以延伸到其他应用场景,如单片机串口转485电路设计中可以使用GPIO口来控制485转接芯片的发送和接收使能。以MAX485为例:1.DE..

    2022年6月10日
    58
  • python进阶(8)多进程

    python进阶(8)多进程进程前置知识点进程:一个程序运行起来后,代码+用到的资源称之为进程,它是操作系统分配资源的基本单元。并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行

    2022年7月28日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号