当前位置: 首页 > news >正文

POJ 3041 Asteroids (最小点覆盖集)

题意

给出一个N*N的矩阵,有些格子上有障碍,要求每次消除一行或者一列的障碍,最少消除多少次可以全部清除障碍。

思路

把关键点取出来:一个障碍至少需要被它的行或者列中的一个消除。 也许是最近在做二分图匹配专辑吧……很容易想到这就是 最小点覆盖集:每条边都至少需要一个点被选中,称这条边被覆盖。 而由 König定理可知 二分图最小点覆盖 = 最大匹配。所以解法也就出来了: 把行当作左点集,列当作右点集,对于每一个障碍,把它的行和列对应的点连一条边,此二分图的最大匹配就是答案了

代码

 
using namespace std;
const int MAXV = 1005;                   //N1+N2
vector  adj[MAXV];
struct MaximumMatchingOfBipartiteGraph{
    int vn;
    void init(int n){                   //二分图两点集点的个数
        vn = n;
        for (int i = 0; i <= vn; i ++)     adj[i].clear();
    }
    void add_uedge(int u, int v){
		adj[u].push_back(v);
		adj[v].push_back(u);
    }
    bool vis[MAXV];
    int mat[MAXV];                      //记录已匹配点的对应点
    bool cross_path(int u){
        for (int i = 0; i < (int)adj[u].size(); i ++){
            int v = adj[u][i];
            if (!vis[v]){
                vis[v] = true;
                if (mat[v] == 0 || cross_path(mat[v])){
                    mat[v] = u;
                    mat[u] = v;
                    return true;
                }
            }
        }
        return false;
    }
    int hungary(){
        mem(mat, 0);
        int match_num = 0;
        for (int i = 1; i <= vn; i ++){
            mem(vis, 0);
            if (!mat[i] && cross_path(i)){
                match_num ++;
            }
        }
        return match_num;
    }
}match;

int main(){
	//freopen("test.in", "r", stdin);
	//freopen("test.out", "w", stdout);
    int n, k;
    while(scanf("%d %d", &n, &k) != EOF){
        match.init(2*n);
        for (int i = 0; i < k; i ++){
            int r, c;
            scanf("%d %d", &r, &c);
            match.add_uedge(r, c+n);
        }
        printf("%d\n", match.hungary());
    }
	return 0;
}

转载于:https://www.cnblogs.com/AbandonZHANG/p/4114075.html

相关文章:

  • 不通过调用__Init__来创建实例
  • 算法学习--动手
  • 10-padding(内边距)
  • linux中grep和egrep的用法
  • hashlib模块学习:hmac
  • 开发基于以太坊智能合约的DApp
  • vue-cli脚手架一些插件安装elementui和axios
  • MD5加密解密
  • MS SQL 需要定期清理日志文件
  • Django-admin管理工具
  • Spring读书笔记-----部署我的第一个Spring项目
  • 减少死锁的几个常用方法
  • ylbtech-cnblogs(博客园)-数据库设计-7,News(新闻)
  • 用whistle和proxifier抓包调试任意客户端的网络请求
  • 一个C#文件传输模块,支持断点续传
  • Android组件 - 收藏集 - 掘金
  • Docker容器管理
  • gitlab-ci配置详解(一)
  • Java深入 - 深入理解Java集合
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • php中curl和soap方式请求服务超时问题
  • Quartz初级教程
  • Redis 中的布隆过滤器
  • sublime配置文件
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 简单基于spring的redis配置(单机和集群模式)
  • 区块链分支循环
  • 智能网联汽车信息安全
  • zabbix3.2监控linux磁盘IO
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​决定德拉瓦州地区版图的关键历史事件
  • #includecmath
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #QT项目实战(天气预报)
  • (33)STM32——485实验笔记
  • (java)关于Thread的挂起和恢复
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (二)Linux——Linux常用指令
  • (强烈推荐)移动端音视频从零到上手(下)
  • (四)Controller接口控制器详解(三)
  • (一)Dubbo快速入门、介绍、使用
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .java 9 找不到符号_java找不到符号
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET DataGridView数据绑定说明
  • .Net MVC4 上传大文件,并保存表单
  • .NET Reactor简单使用教程
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • @RequestMapping处理请求异常
  • [04]Web前端进阶—JS伪数组
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [Bugku]密码???[writeup]