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)
上一篇 2021年7月6日 下午9:00
下一篇 2021年7月6日 下午10:00


相关推荐

  • php判断股票涨停,常用的五种股票打板思路与常见的几种涨停板打板判断依据

    php判断股票涨停,常用的五种股票打板思路与常见的几种涨停板打板判断依据对龙头股是一种信仰 不是看见了才相信 而是相信了就会看见 天下武功 唯快不破 做超短尤其打板是小资金迅速做大的有效方式 但没有练好基本功 打板也是亏损最快的方式 很多朋友希望学到一些打板的技术 今天就来说说我总结的一些打板技巧 希望大家自我甄别 权当一家之言 打板不一定是最有效的策略 但绝对是有效的策略之一 对于打板客来说 我觉得最难的就是空仓 最难的就是这个心魔 当你越过这一关 就是一个质的飞跃

    2026年3月16日
    1
  • 【机器学习笔记】有监督学习和无监督学习

    【机器学习笔记】有监督学习和无监督学习有监督学习和无监督学习(一)有监督学习(二)无监督学习(三)二者的区别(四)如何在两者中选择合适的方法(一)有监督学习概念:通过已有的训练样本去训练得到一个最优模型,再利用这个模型将所有的输入映射为相应的输出,对输出进行简单的判断从而实现预测和分类的目的,也就具有了对未知数据进行预测和分类的能力。简单来说,就像有标准答案的练习题,然后再去考试,相比没有答案的练习题然后去考试准确率更高。监督学…

    2022年5月28日
    54
  • TCP协议的优化方法「建议收藏」

    TCP协议的优化方法「建议收藏」TCP协议的优化方法

    2022年6月24日
    28
  • envi单波段阈值法提取水体_等吸收双波长法

    envi单波段阈值法提取水体_等吸收双波长法水体提取方法之单波段阈值法升级版,利用MNDWI,NDWI,INDVI结合分析,单波段提取水体

    2022年10月21日
    4
  • 解决Centos/Redhat,命令不存在

    解决Centos/Redhat,命令不存在

    2022年2月23日
    68
  • TinyXML用法小结[通俗易懂]

    TinyXML用法小结[通俗易懂]TinyXML用法小结1.     介绍Tinyxml的官方网址:http://www.grinninglizard.com官方介绍文档:http://www.grinninglizard.com/tinyxmldocs/tutorial0.html在TinyXML中,根据XML的各种元素来定义了一些类:TiXmlBase:整个TinyXML模型的基类。TiXmlAttr…

    2022年5月7日
    92

发表回复

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

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