题目链接:点击查看

题目大意:给出n个牛奶机器,再给出m只奶牛,每个机器只能让最多k只牛一起挤奶,现在问如何分配奶牛,能让最远的那只奶牛到达机器的距离最小

题目分析:很综合的一道题目了,不算很难,但比较难想,首先看到求最大值的最小值或者求最小值的最大值的这种问题,第一反应肯定是二分了,我们可以二分答案,也就是最远距离,不过在check之前,我们先要对给出的邻接矩阵跑一遍floyd,以保证两点之间的距离是他们的最短路,这样才能符合题意,然后我们该怎么check呢,每次二分出最远距离后,对于最短路小于等于该距离的两点就可以建边了,注意!之前二分图匹配的题比如男孩女孩匹配,建边的时候让男孩指向女孩也行,女孩指向男孩也可以,最后不影响结果的,但这个题目不一样,我们的目的是要让所有的奶牛能找到一个机器,而不是让所有的机器都找到一个奶牛,所以我们这里建边要用奶牛指向机器,然后跑匈牙利的时候也要以奶牛去匹配机器才行,这里涉及到了一点新知识,也就是二分图的多重匹配问题,其实和单一匹配的思路是一样的,就是将match[N]变为了match[N][N],就可以了,第一维维护的是哪个点,第二维维护的是有哪些点与之匹配,若当前的机器还没有匹配够足够的奶牛,也就是还没有达到上限k,我们就直接将其匹配即可,若达到了上限,我们就看一下能不能让其他的奶牛去别的机器,也就是进入dfs寻找增广路

题外话,因为floydWA了好几发,好久没写最短路了,也是今天才知道floyd的三层枚举顺序是固定的。。是我太菜了嘛,大概可以这样理解,最外层枚举中间断点k,内层枚举起点i和终点j,相当于让i到j之间的点不断松弛,必须固定k不能动,不然k一动的话答案就错了

具体实现看代码吧,应该不难懂,三个很简单的算法组合出来了这个题目

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=250;int n,m,limit;vector<int>match[N];//这里我为了方便记录第二维的长度,用vector代替了二维数组bool maze[N][N],vis[N];int d[N][N];bool dfs(int x)
{for(int i=1;i<=n;i++){if(maze[x][i]&&!vis[i]){vis[i]=true;if(match[i].size()<limit)//如果当前与之匹配的点还没满,直接加入即可{match[i].push_back(x);return true;}for(int j=0;j<limit;j++)//否则依次寻找增广路{if(dfs(match[i][j])){match[i][j]=x;return true;}}}}return false;
}bool check(int x)
{memset(maze,false,sizeof(maze));//每次跑匈牙利之前都要记得初始化for(int i=1;i<=n;i++)match[i].clear();for(int i=1;i<=n;i++)//建边for(int j=n+1;j<=n+m;j++){if(d[i][j]<=x)maze[j-n][i]=true;}for(int i=1;i<=m;i++)//跑匈牙利{memset(vis,false,sizeof(vis));if(!dfs(i))return false;}return true;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);while(scanf("%d%d%d",&n,&m,&limit)!=EOF){for(int i=1;i<=n+m;i++)for(int j=1;j<=n+m;j++){scanf("%d",&d[i][j]);if(!d[i][j])d[i][j]=inf;}for(int k=1;k<=n+m;k++)//floyd for(int i=1;i<=n+m;i++)for(int j=1;j<=n+m;j++)if(d[i][j]>d[i][k]+d[k][j])d[i][j]=d[i][k]+d[k][j];int l=0,r=inf;int ans;while(l<=r)//二分答案:最远距离{int mid=l+r>>1;if(check(mid)){ans=mid;r=mid-1;}elsel=mid+1;}printf("%d\n",ans);}return 0;
}

POJ - 2112 Optimal Milking(二分+二分图最大匹配-多重匹配(修改匈牙利实现)+Floyd求最短路)相关推荐

  1. POJ 2112 Optimal Milking(二分图匹配)

    [题目链接] http://poj.org/problem?id=2112 [题目大意] 给出一些挤奶器,每台只能供给M头牛用,牛和挤奶器之间有一定的距离 现在要让每头牛都挤奶,同时最小化牛到挤奶器的 ...

  2. poj 2112 Optimal Milking(二分+Floyd+最大流)

    题意:K个产奶机,C头奶牛,每个产奶机最多可供M头奶牛使用:并告诉了产奶机.奶牛之间的两两距离Dij(0<=i,j<K+C). 问题:如何安排使得在任何一头奶牛都有自己产奶机的条件下,奶牛 ...

  3. POJ 2112 Optimal Milking(二分+最大流)

    POJ 2112 Optimal Milking 题目链接 题意:给定一些机器和奶牛,在给定距离矩阵,(不在对角线上为0的值代表不可达),每一个机器能容纳m个奶牛.问全部奶牛都能挤上奶,那么走的距离最 ...

  4. POJ - 3614 Sunscreen(贪心/二分图最大匹配-多重匹配/网络流-最大流)

    题目链接:点击查看 题目大意:给出n头奶牛,奶牛们现在要晒太阳,每头奶牛需要[l,r]区间内的光照强度,现在有m种防晒霜,每种防晒霜可以让奶牛接受到val数值的光照强度,然后每种防晒霜只有num个,现 ...

  5. CH - 6803 导弹防御塔(二分图最大匹配-多重匹配(拆点法))

    题目链接:点击查看 题目大意:给出n个炮塔,再给出m个敌人,每个炮塔都可以持续发射导弹,不过发射导弹的时间是t1秒,炮塔冷却的时间是t2分钟,炮弹飞行的速度是v,炮塔和敌人之间的距离按照欧几里得距离计 ...

  6. 【bzoj4443】[Scoi2015]小凸玩矩阵 二分+二分图最大匹配

    题目描述 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的N个数中第K大的数字的最小值是多少. ...

  7. poj 3020 Antenna Placement(二分图最大匹配)

    题意: N行M列的矩阵,每个格子里不是 * 就是 O . * :是一个利益点. O:是一个空白点. 每次可以用一个圈覆盖相邻的两个*.(左右相邻或上下相邻). 问最少需要多少个圈可以覆盖所有的*. 思 ...

  8. POJ - 3041 Asteroids(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目分析:给出一个n*n的矩阵,其中有m个敌人,每一次操作可以清除某一列或某一行中的所有敌人,问若想清除所有敌人,至少需要多少次操作 题目分析:第一次见这种题,就是最小覆盖是要用最 ...

  9. POJ-2112 Optimal Milking 二分+网络流

    题意: 有K个挤奶站,C头奶牛,每个挤奶站每天最多只能够为M头奶牛服务,奶牛到奶牛,奶牛到挤奶站都有一个距离,问一天能够为所有的奶牛都挤奶的匹配方案中,选择最远的距离最小方案. 解法: 通过二分枚举来 ...

最新文章

  1. Direct2D (15) : 剪辑
  2. 智慧少年队显示服务器异常,六大智慧少年是什么梗,六大智慧少年其它五个
  3. sublime text 2 c++编译 环境 问题小结
  4. Android 架构 -- Room
  5. 6.4 如何初始化聚类中心-机器学习笔记-斯坦福吴恩达教授
  6. PIC单片机入门_PICC的指向RAM的指针
  7. 大数据量分页存储过程效率测试附代码
  8. mysql按日期查询数据_mysql按日期查询数据
  9. RocketMQ 源码之 异步和同步请求 以及异步的回调 是怎么做到的
  10. VMware ESXI 5.5 注册码
  11. Microsoft Word 2010 - 清除格式
  12. linux笔记本风扇调节,Linux下笔记本的风扇控制问题
  13. mongodb的安装和使用
  14. 范数和条件数(Norms and Condition Numbers)
  15. 怎样隐藏Word内容?这样操作只需30秒!
  16. 梯度grad公式_FLAC3D梯度计算详解
  17. Icon是什么,在线实现图片转Icon的方法
  18. 3.qt-图解Weiler-Atherton任意多边形剪裁算法
  19. Android 6.0新特性
  20. 微前端框架qiankun开发到部署保姆式教程原理与实战

热门文章

  1. 文件上传下载-准备上传页面
  2. linux7添加两个网关,RHEL7设置IP地址、网关和DNS
  3. ui uview 安卓开发_uni-app UI框架之uview-ui使用教程
  4. 上传 录音_老罗推荐的是最好吗?AI旗舰录音笔对比评测
  5. No module named ‘XX‘
  6. 关于导入geoserver 源码到Eclipse编译运行
  7. 安卓开源项目周报0215
  8. 笨办法学C 练习28:Makefile 进阶
  9. shaderlab UV动画所需的变量声明
  10. 使用装饰器时带括号与不带括号的区别