POJ1548

来源:互联网 发布:南泥湾种鸦片 知乎 编辑:程序博客网 时间:2024/06/02 04:08

Problem : Robots
Description : 一些机器人清理矩阵中的垃圾,机器人只能往下走和往右走。现在所有的机器人一开始都在左上角。现在问你最少需要多少个机器人才能清理所有的垃圾。
Solution : 二分图的最小路径覆盖。构图就不多说了,但是要注意的是我们连边的时候要往下和右这两个方向连,遇到第一个垃圾就停止连边了。两个垃圾有可能在矩形的对角上,这两个垃圾是可以连边的,这一点要特别注意!
Code(C++) :

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <string>#include <vector>#define MIN(a,b) ((a)>(b)? (b):(a))using namespace std;const int F=25*25+5;const int E=25+5;const int INF=0x3f3f3f3f;typedef struct tagNode{    int p,t,d;    tagNode(){}    tagNode(int P,int T,int D):        p(P),t(T),d(D){}}Node;int n;vector<int> edge[F];bool used[F];int belong[F];Node line[F];int map[E][E];bool cmp(Node a,Node b){    return a.t<b.t;}bool dfs(int s){    for(int i=0;i<edge[s].size();i++){        int end=edge[s].at(i);        if(used[end])            continue;        used[end]=true;        if(belong[end]==-1||dfs(belong[end])){            belong[end]=s;            return true;        }    }    return false;}int main(){    //freopen("in.data","r",stdin);    int x,y;    while(scanf("%d%d",&x,&y),!(x==-1&&y==-1)){        memset(map,0,sizeof(map));        n=0;        map[x][y]=++n;        for(int i=0;i<F;i++)            edge[i].clear();        memset(belong,-1,sizeof(belong));        while(scanf("%d%d",&x,&y),!(!x&&!y))            map[x][y]=++n;        for(int i=1;i<E;i++)            for(int j=1;j<E;j++)                if(map[i][j]){                    for(int y=j+1;y<E;y++)                        if(map[i][y]){                            edge[map[i][j]].push_back(map[i][y]);                            break;                        }else{                            for(int x=i+1;x<E;x++)                                if(map[x][y]){                                    edge[map[i][j]].push_back(map[x][y]);                                    break;                                }                        }                    for(int x=i+1;x<E;x++)                        if(map[x][j]){                            edge[map[i][j]].push_back(map[x][j]);                            break;                        }else{                            for(int y=j+1;y<E;y++)                                if(map[x][y]){                                    edge[map[i][j]].push_back(map[x][y]);                                    break;                                }                        }                }        int sum=0;        for(int i=1;i<=n;i++){            memset(used,false,sizeof(used));            if(dfs(i))                ++sum;        }        printf("%d\n",n-sum);    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 没提前预约四维怎么办 ct检查冠脉钙化怎么办 残角子宫有内膜怎么办 怀孕了长痔疮了怎么办 人流后子宫内膜薄怎么办 多囊子宫内膜薄怎么办 6岁儿童不爱睡觉怎么办 初生儿嗓子哑了怎么办 6岁儿童睡眠不好怎么办 8岁儿童睡眠不好怎么办 1个月婴儿睡眠少怎么办 三岁宝宝心跳快怎么办 宝宝右心房稍大怎么办 胎儿右心房偏大怎么办 胎心监测波动小怎么办 怀孕6个月不想要了怎么办 高敏肌钙蛋白t高怎么办 龟头沟槽里长疙瘩怎么办 肝郁气滞的体质怎么办 手指甲长在肉里怎么办 甲床与指甲脱离怎么办 指甲往肉里面长怎么办 指甲和肉分离是怎么办 大脚趾指甲空了怎么办 脚趾甲长在肉里怎么办 脚趾甲又厚又硬怎么办 小孩子咳嗽有痰怎么办%3f 支气扩张咳血怎么办小 背部第8块脊椎疼怎么办 坐时间长了背疼怎么办 新生儿总哭怎么办吐奶 婴儿吃饱了还哭怎么办 宝宝喉咙哭哑了怎么办 婴儿哭哑了嗓子怎么办 婴儿胖子哭哑了怎么办 孩子声音哭哑了怎么办 喝咖啡手抖心慌怎么办 累了就心慌发抖怎么办 经常头晕心慌胸闷乏力怎么办 在末地迷路了怎么办 在森林里迷路了怎么办