• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

cynchanpin

  • 博客园
  • 联系
  • 订阅
  • 管理

View Post

poj 3041 Asteroids (最小点覆盖)

链接:poj 3041

题意:有一个n*n的矩阵,在矩阵上有m个行星,一个武器能够消灭同一行或者同一列的星星

求最小的要用多少武器消灭全部的星星

思路:把方阵看做一个特殊的二分图(以行列分别作为两个顶点集V1、V2,当中|V1|=|V2|)

然后把每行x或者每列y看成一个点,而障碍物(x,y)能够看做连接x和y的边。依照这样的思路建图,问题就转化成为选择最少的一些点(x或y)。使得从这些点与全部的边相邻,事实上这就是最小点覆盖问题。

最小点覆盖数 = 最大匹配数

这样本题就转化为求最大匹配数了

[cpp] view plaincopyprint?
  1. #include<stdio.h>  
  2. #include<string.h>  
  3. int edge[550][550],n,used[550],link[550];  
  4. int dfs(int pos)  
  5. {  
  6.     int i;  
  7.     for(i=1;i<=n;i++)  
  8.         if(edge[pos][i]&&!used[i]){  
  9.             used[i]=1;  
  10.             if(link[i]==-1||dfs(link[i])){  
  11.                 link[i]=pos;  
  12.                 return 1;  
  13.             }  
  14.         }  
  15.     return 0;  
  16. }  
  17. int main()  
  18. {  
  19.     int i,a,b,s,m;  
  20.     scanf("%d%d",&n,&m);  
  21.     memset(edge,0,sizeof(edge));  
  22.     for(i=0;i<m;i++){  
  23.         scanf("%d%d",&a,&b);  
  24.         edge[a][b]=1;  
  25.     }  
  26.     s=0;  
  27.     memset(link,-1,sizeof(link));  
  28.     for(i=1;i<=n;i++){  
  29.         memset(used,0,sizeof(used));  
  30.         s+=dfs(i);  
  31.     }  
  32.     printf("%d\n",s);  
  33.     return 0;  
  34. }  

posted on 2017-06-13 16:09  cynchanpin  阅读(128)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3