题目链接: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 }