POJ1548 Robots【二分图最小路径覆盖】

来源:互联网 发布:nginx轮询 编辑:程序博客网 时间:2024/05/09 10:48

题目链接:

http://poj.org/problem?id=1548


题目大意:

在一个N*M(N <= 24,M <= 24)的图中,有很多垃圾, 清理垃圾的机器人从左上角开始清理。

知机器人只能向右或是向下清理垃圾,在清理完一个地方的垃圾后可以继续向右或是向下去清

其他垃圾。最终运行到(N,M)的位置终止。问:最少需要多少个机器人,能清理完所有的垃圾。


思路:

图中没有给N和M的大小,只是给出了垃圾的位置。输入用0 0表示一组数据输入结束。建一个结构

体来存储垃圾的坐标值。现在来建一个二分图,图的两边就是垃圾的节点,遍历原图,如果垃圾j在

垃圾i的右下角,就将(i,j)加入到二分图中,最后问题就变为了:求该二分图的最小路径覆盖。由

分图最小路径覆盖 = 点数 - 二分图最大匹配,根据匈牙利算法求出二分图最大匹配,然后得出结果。


AC代码:

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;const int MAXN = 600;struct Node{    int x;    int y;}Point[MAXN];bool Map[MAXN][MAXN],Mask[MAXN];int NX,NY;int cx[MAXN],cy[MAXN];int FindPath(int u){    for(int i = 0; i < NY; ++i)    {        if(Map[u][i] && !Mask[i])        {            Mask[i] = 1;            if(cy[i] == -1 || FindPath(cy[i]))            {                cy[i] = u;                cx[u] = i;                return 1;            }        }    }    return 0;}int MaxMatch(){    for(int i = 0; i < NX; ++i)        cx[i] = -1;    for(int i = 0; i < NY; ++i)        cy[i] = -1;    int res = 0;    for(int i = 0; i < NX; ++i)    {        if(cx[i] == -1)        {            for(int j = 0; j < NY; ++j)                Mask[j] = 0;            res += FindPath(i);        }    }    return res;}int main(){    int id = 0;    while(scanf("%d%d",&Point[id].x,&Point[id].y) && (Point[id].x!=-1 && Point[id].y!=-1))    {        id++;        while(scanf("%d%d",&Point[id].x,&Point[id].y) && (Point[id].x||Point[id].y))            id++;        memset(Map,0,sizeof(Map));        for(int i = 0; i < id; ++i)        {            for(int j = i+1; j < id; ++j)            {                if(Point[i].x <= Point[j].x && Point[i].y <= Point[j].y)                    Map[i][j] = 1;                else if(Point[i].x >= Point[j].x && Point[i].y >= Point[j].y)                    Map[j][i] = 1;            }        }        NX = NY = id;        printf("%d\n",id-MaxMatch());        id = 0;    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 幼儿园小朋友很调皮怎么办 幼儿园小朋友上课调皮怎么办 孩子误冲游戏怎么办 遇到别的熊孩子怎么办 幼儿园遇到熊孩子怎么办 高铁上遇到熊孩子怎么办 幼儿爱打人家长怎么办 妈妈爱打孩子怎么办 35儿童爱打人怎么办? 一岁半宝宝太调皮怎么办 儿子高一不听话怎么办 小孩说了不听话怎么办 我的妈妈文盲怎么办 电脑键盘反拼音怎么办 小孩学习态度差怎么办 孩子不好好上学怎么办 小孩读书态度不好怎么办 幼儿园孩子不认识数字怎么办 一年级孩子拼音很差怎么办 孩子的拼音不好怎么办 小孩不会拼拼音怎么办 小孩拼音学不会怎么办 儿童l发音不准怎么办 小孩发音不标准怎么办 拼音l发音不准怎么办 孩子拼音声调分不清怎么办 小孩gk读成dt怎么办 拼音音调学不会怎么办 会拼音不会打字怎么办 大人拼音学不会怎么办 志愿服务经历少怎么办 医保报销发票丢失怎么办 费用发票丢失了怎么办 小孩乱拿东西怎么办 在家突然生了怎么办 二胎在家生的怎么办? 奶有一边没有怎么办 孩子应用题很弱怎么办 做不到不嫉妒怎么办 小孩自律太差怎么办 小学四年级数学差怎么办