POJ3014 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/p/2784303.html