POJ 3041:Asteroids

来源:互联网 发布:c语言宏定义 编辑:程序博客网 时间:2024/06/05 14:46

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


N*N的网格中,有K颗小行星,给出K棵小行星的位置,提供一个武器,一次可以消灭

一行星星或一列星星。求至少发多少枪可以将网格中的行星消灭殆尽。


光束作为图的顶点,小行星代表连接光束的边,横向是一个集合,纵向是一个集合,

一个行星可以从横向扫除去或纵向扫除去,就把它当作连接两个集合的边,则转化为

二分图匹配问题。


AC代码:

#include <iostream>#include <stdio.h>#include <string.h>#include <vector>using namespace std;///行采取1~N编号,列采取N+1~2*Nconst int maxn = 1005;vector<int>node[maxn];int N,K;   ///N行N列的矩阵,K个行星int vis[maxn];int match[maxn];bool hungry(int u){    for(int i = 0; i < (int)node[u].size(); i++)    {        int v = node[u][i];        if(vis[v] == 0)        {            vis[v] = 1;            if(match[v] == -1 || hungry(match[v]))            {                match[v] =  u;                match[u] =  v;                return true;            }        }    }    return false;}int solve(){    memset(match,-1,sizeof(match));    int ans = 0;    for(int i = 1; i <= 2*N; i++)    {        if(match[i]==-1)        {            memset(vis,0,sizeof(vis));            if(hungry(i))                ans++;        }    }    return ans;}int main(){    while(~scanf("%d%d",&N,&K))    {        int x,y;        for(int i = 1; i <= 2*N; i++)            node[i].clear();        for(int i = 1; i <= K; i++)        {            scanf("%d%d",&x,&y);            node[x].push_back(N+y);            node[N+y].push_back(x);        }        printf("%d\n",solve());    }    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婴儿多久可以竖抱 宝宝多久可以竖抱 3个月宝宝可以竖抱吗 婴儿三个月能竖着抱吗 三个月宝宝能竖抱吗 宝宝几个月能竖着抱 两个月宝宝可以竖着抱吗 两个月宝宝可以竖抱吗 几个月宝宝可以竖抱 几个月宝宝可以竖着抱 三个月宝宝可以竖着抱吗 三个月宝宝可以竖抱吗 新生儿几个月可以竖着抱 婴儿几个月可以竖着抱 婴儿什么时候可以竖着抱 婴儿什么时候可以竖抱 新生儿几个月可以竖抱 宝宝三个月可以竖着抱吗 小孩几个月可以竖着抱 宝宝什么时候可以竖着抱 宝宝什么时候可以竖抱 孩子几个月可以竖着抱 小孩几个月可以竖抱 孩子几个月可以竖抱 宝宝几个月才能竖着抱 三个月的宝宝可以竖着抱吗 两个多月的宝宝可以竖着抱吗 宝宝什么时候能竖着抱 两个月的宝宝可以竖着抱吗 几个月的宝宝可以竖着抱 几个月婴儿可以竖着抱 婴儿三个月可以竖抱吗 2个月的宝宝可以竖着抱吗 小宝宝几个月可以竖着抱 婴儿两个月可以竖抱吗 婴幼儿几个月可以竖着抱 一个月的宝宝可以竖着抱吗 多大的婴儿可以竖着抱 二个月的宝宝可以竖着抱吗 几个月的宝宝可以竖抱 多大的宝宝可以竖着抱