POJ-3014 Asteroids 最小点覆盖

  题目链接:http://poj.org/problem?id=3041

  很基础的最小点覆盖题目,把X,Y坐标轴上的点分别看做X集合和Y集合,然后如果有asteroid就连边,很容易看出就是把所有的边覆盖,即用最少的点覆盖所有的边。

  最小点覆盖=最大匹配数

 1 //STATUS:G++_AC_47MS_668KB
 2 #include<stdio.h>
 3 #include<math.h>
 4 #include<stdlib.h>
 5 #include<string.h>
 6 #include<string>
 7 #define LL __int64
 8 const int MAX=510,INF=1000000000;
 9 
10 bool g[MAX][MAX];
11 int vis[MAX],y[MAX],ok[MAX];
12 int n,m;
13 
14 int DFS(int u)
15 {
16     if(ok[u])return 1;
17     int i;
18     for(i=0;i<n;i++)
19         if(g[u][i] && !vis[i]){
20             vis[i]=1;
21             if(y[i]==-1 || DFS(y[i])){
22                 y[i]=u;
23                 return 1;
24             }
25         }
26     return 0;
27 }
28 
29 int main()
30 {    
31 //    freopen("in.txt","r",stdin);
32     int i,a,b,ans;
33     while(~scanf("%d%d",&n,&m))
34     {
35         memset(g,0,sizeof(g));
36         memset(ok,0,sizeof(ok));
37         memset(y,-1,sizeof(y));
38         for(i=0;i<m;i++){
39             scanf("%d%d",&a,&b);
40             g[a-1][b-1]=1;
41         }
42 
43         for(i=ans=0;i<n;i++){
44             memset(vis,0,sizeof(vis));
45             if(DFS(i))ans++;
46             else ok[i]=1;
47         }
48 
49         printf("%d\n",ans);
50     }
51     return 0;
52 }

转载于:https://www.cnblogs.com/zhsl/archive/2012/11/23/2784303.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值