博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3041 Asteroids(最小点覆盖)
阅读量:5272 次
发布时间:2019-06-14

本文共 1026 字,大约阅读时间需要 3 分钟。

题意:

N*N的矩阵,有K个敌人,坐标分别是(C1,C1),.....,(Rk,Ck)。

有一个武器,每发射一次,可消掉某行或某列上的所有的敌人。

问消灭所有敌人最少需要多少发。

 

思路:

二分建图:左边N个点代表行号,右边N个点代表列号。如果第i行第j列上有敌人,则将左边点i和右边点j连一条线。

则转化为求此二分图的最小点覆盖,即最大匹配。【这个建图思想太妙了!赞!】

 

代码:

int n,k;vector
graph[505];bool bmask[505];int cx[505],cy[505];int findPath(int u){ int L=graph[u].size(); rep(i,0,L-1){ int v=graph[u][i]; if(!bmask[v]){ bmask[v]=true; if(cy[v]==-1||findPath(cy[v])){ cy[v]=u; cx[u]=v; return 1; } } } return 0;}int MaxMatch(){ int ans=0; rep(i,1,n) cx[i]=cy[i]=-1; rep(i,1,n) if(cx[i]==-1){ mem(bmask,false); ans+=findPath(i); } return ans;}int main(){ while(scanf("%d%d",&n,&k)!=EOF){ rep(i,1,n) graph[i].clear(); while(k--){ int r,c; scanf("%d%d",&r,&c); graph[r].push_back(c); } int dd=MaxMatch(); printf("%d\n",dd); }}

 

转载于:https://www.cnblogs.com/fish7/p/4088403.html

你可能感兴趣的文章
【雷电】源代码分析(二)-- 进入游戏攻击
查看>>
Linux中防火墙centos
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
centos下同时启动多个tomcat
查看>>
Leetcode Balanced Binary Tree
查看>>
[JS]递归对象或数组
查看>>
linux sed命令
查看>>
湖南多校对抗赛(2015.03.28) H SG Value
查看>>
hdu1255扫描线计算覆盖两次面积
查看>>
hdu1565 用搜索代替枚举找可能状态或者轮廓线解(较优),参考poj2411
查看>>
程序存储问题
查看>>
优雅地书写回调——Promise
查看>>
AX 2009 Grid控件下多选行
查看>>
PHP的配置
查看>>
Struts框架----进度1
查看>>
Round B APAC Test 2017
查看>>
MySQL 字符编码问题详细解释
查看>>
Ubuntu下面安装eclipse for c++
查看>>
Windows 2003全面优化
查看>>
格而知之2:UIView的autoresizingMask属性探究
查看>>