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 }

你可能感兴趣的:(poj)