前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POJ 3041 Asteroids(匈牙利算法)

POJ 3041 Asteroids(匈牙利算法)

作者头像
Ch_Zaqdt
发布2019-01-08 09:47:39
5880
发布2019-01-08 09:47:39
举报
文章被收录于专栏:Zaqdt_ACM

       题意就是有一个地图,然后给你几个点的坐标标记为'x',然后你有一个武器,每次可以消灭一行或一列的'x',问最少需要几次能把所有的'x'消灭完。然后我们可以构建一个二分图,然后这就是一个最小覆盖集问题,最小覆盖数 = 最大匹配数,根据匈牙利算法就能求了。先上代码,以后再补详细的解释。

AC代码:

代码语言:javascript
复制
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int b[10005];
int vis1[10005];
int vis[10005][10005];
int n,m,sum;

bool Find(int x){
  for(int i=1;i<=n;i++){
    if(vis[x][i] && !vis1[i]){
      vis1[i] = 1;
      if(b[i] == 0 || Find(b[i])){
        b[i] = x;
        return true;
      }
    }
  }
  return false;
}

int main()
{
  scanf("%d%d",&n,&m);
  for(int i=0;i<m;i++){
    int x,y;
    cin>>x>>y;
    vis[x][y] = 1;
  }
  sum = 0;
  memset(b,0,sizeof(b));
  for(int i=1;i<=n;i++){
    memset(vis1,0,sizeof(vis1));
    if(Find(i))sum++;
  }
  cout<<sum<<endl;
  return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年04月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档