POJ 3041 Asteroids(最小顶点覆盖)

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

题意:给出一个N*N的矩阵,代表一个狩猎场,有的位置有动物。已知一枪可以打死一行或一列上的所有动物。问最少多少枪可以打死所有的动物。

思路:以行作为X集合,以列作为Y集合,一个动物在(x,y),则x对应X中的点向y对应Y中的点连一条边,则某个顶点一旦被选,则与之相连的边(也就是动物)都会被选,也就是选出最少的顶点覆盖所有的边,即最小顶点覆盖。

 

#include <iostream>

#include <cstdio>

#include <cstring>

using namespace std;





const int MAX=505;

int a[MAX][MAX],visit[MAX],link[MAX];

int n,m;



int DFS(int u)

{

    int v;

    for(v=1;v<=n;v++) if(!visit[v]&&a[u][v])

    {

        visit[v]=1;

        if(link[v]==0||DFS(link[v]))

        {

            link[v]=u;

            return 1;

        }

    }

    return 0;

}



int main()

{

    scanf("%d%d",&n,&m);

    int i,x,y;

    for(i=1;i<=m;i++)

    {

        scanf("%d%d",&x,&y);

        a[x][y]=1;

    }

    int ans=0;

    for(i=1;i<=n;i++)

    {

        memset(visit,0,sizeof(visit));

        ans+=DFS(i);

    }

    printf("%d\n",ans);

    return 0;

}

 

  

 

 

你可能感兴趣的:(poj)