poj 3041 Asteroids (二分匹配)

来源:互联网 发布:北京凶宅数据库怎么查 编辑:程序博客网 时间:2024/05/22 10:51

大概题意:在n*n的矩阵上有k个行星,有一种武器一次可以消去一行或者一列的行星,问最少要用这个武器多少次。

方法:行和列匹配,然后最小点覆盖,即最大匹配。

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int map[501][501],vis[501],y[501],n,k;bool dfs(int i){    for(int j=1;j<=n;j++)    {        if(map[i][j]&&!vis[j])        {            vis[j]=1;            if(!y[j]||dfs(y[j]))            {                y[j]=i;                return true;            }        }    }    return false;}void match(){    memset(y,0,sizeof(y));    int i,ans=0;    for(i=1;i<=n;i++)    {        memset(vis,0,sizeof(vis));        if(dfs(i)) ans++;    }    printf("%d\n",ans);}int main(){    while(scanf("%d%d",&n,&k)!=EOF)    {        int i;        memset(map,0,sizeof(map));        for(i=1;i<=k;i++)        {            int r,c;            scanf("%d%d",&r,&c);            map[r][c]=1;        }        match();    }    return 0;}


原创粉丝点击