博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Poj 2112 Optimal Milking (多重匹配+传递闭包+二分)
阅读量:5164 次
发布时间:2019-06-13

本文共 1175 字,大约阅读时间需要 3 分钟。

题目链接:

  

题目描述:

  有k个挤奶机,c头牛,每台挤奶机每天最多可以给m头奶牛挤奶。挤奶机编号从1到k,奶牛编号从k+1到k+c,给出(k+c)*(k+c)的矩阵maps,maps[i][j]代表i到j的距离,问到达挤奶机需要步行最长的奶牛最短要走多少距离?(刚开始看到题目很迷啊,怎么算测试实例答案都是1,原来是非真实存在的路径长度都记为0,那么maps中的零就是INF咯)。

解题思路:

  因为要找出步行最长距离的奶牛最少走多远,每个奶牛到达挤奶机之前可以经过多条路径,所以我们要先进行一次floyd进行传递闭包,让maps[i][j]为i到j的最短路径。然后二分枚举奶牛的路径最大距离,每次用多重匹配判断是否合法即可。

1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 7 const int INF = 0x3f3f3f3f; 8 const int maxn = 250; 9 int maps[maxn][maxn], used[35][15], link[35], vis[35];10 int mid, low, high, k, c, m;11 void floyd (int n)12 {13 for (int k=1; k<=n; k++)14 for (int i=1; i<=n; i++)15 for (int j=1; j<=n; j++)16 {17 maps[i][j] = min (maps[i][j], maps[i][k]+maps[k][j]);18 high = max (maps[i][j], high);19 low = min (low, maps[i][j]);20 }21 }22 bool Find (int x)23 {24 for (int i=1; i<=k; i++)25 {26 if (!vis[i] && maps[x][i]<=mid)27 {28 vis[i] = 1;29 if (link[i]

 

转载于:https://www.cnblogs.com/alihenaixiao/p/4718221.html

你可能感兴趣的文章
如何将红色区域数据调用解密函数直接打印到输出控制台(例如:crt控制台)...
查看>>
React-AR概述
查看>>
踏上Salesforce的学习之路(一)
查看>>
json中拿到想拿的值
查看>>
ios开发抽屉效果的封装使用
查看>>
C#使用Log4Net记录日志
查看>>
从struts2源码学到的技巧
查看>>
xcode如何运行下载的demo工程
查看>>
JavaScript Date 日期操作
查看>>
优秀程序员不得不知道的20个位运算技巧
查看>>
70:Climbing Stairs【DP】
查看>>
jquery实现全选、反选、不选
查看>>
logback配置
查看>>
ECMA5中定义的对象属性特性和方法
查看>>
2、zabbix工作原理及安装配置
查看>>
2、Docker基础用法
查看>>
PostgreSQL 自增主键
查看>>
加快linux ssh登录的方法
查看>>
ORACLE表空间详解
查看>>
BZOJ5190 Usaco2018 Jan Stamp Painting(动态规划)
查看>>