题目链接:

  Poj 2112 Optimal Milking

题目描述:

  有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的最短路径。然后二分枚举奶牛的路径最大距离,每次用多重匹配判断是否合法即可。

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; const int INF = 0x3f3f3f3f;
const int maxn = ;
int maps[maxn][maxn], used[][], link[], vis[];
int mid, low, high, k, c, m;
void floyd (int n)
{
for (int k=; k<=n; k++)
for (int i=; i<=n; i++)
for (int j=; j<=n; j++)
{
maps[i][j] = min (maps[i][j], maps[i][k]+maps[k][j]);
high = max (maps[i][j], high);
low = min (low, maps[i][j]);
}
}
bool Find (int x)
{
for (int i=; i<=k; i++)
{
if (!vis[i] && maps[x][i]<=mid)
{
vis[i] = ;
if (link[i]<m)
{
used[i][link[i] ++] = x;
return true;
}
for (int j=; j<m; j++)
if (Find(used[i][j]))
{
used[i][j] = x;
return true;
}
}
}
return false;
}
bool hungry ()
{
memset (link, , sizeof(link));
for (int i=k+; i<=k+c; i++)
{
memset (vis, , sizeof(vis));
if (!Find(i))
return false;
}
return true;
}
int main ()
{
while (scanf ("%d %d %d", &k, &c, &m) != EOF)
{
int n = k + c;
for (int i=; i<=n; i++)
for (int j=; j<=n; j++)
{
scanf ("%d", &maps[i][j]);
if (maps[i][j] == && i!=j)
maps[i][j] = INF;
}
high = , low = INF;
floyd (n);
int ans;
while (low <= high)
{
mid = (low+high)/;
if (hungry())
{
ans = mid;
high = mid - ;
}
else
low = mid + ;
}
printf ("%d\n", ans);
}
return ;
}

最新文章

  1. linux基本知识
  2. db2无法force掉备份连接的处理办法
  3. 【转】缺少servlet-api.jar包
  4. Android线程之主线程向子线程发送消息
  5. dialogic d300语音卡驱动重装后启动报错问题解决方法
  6. Web Browser使用技巧
  7. Git stash方法(转)
  8. 各浏览器各版本User-agent汇总 欢迎补充
  9. js给数字加三位一逗号间隔的两种方法(面试题)
  10. selenium webdriver 环境搭建--java
  11. OneToMany与ManyToOne的属性
  12. 使用接口的方式调用远程服务 ------ 利用动态调用服务,实现.net下类似Dubbo的玩法。
  13. Python3.4入门之ifelse错误解决方案
  14. AngularJS学习篇(九)
  15. Subscription wildcards(MQTT)
  16. Java 并发编程:volatile的使用及其原理
  17. [MNIST数据集]输入图像的预处理
  18. echarts绘制k线图为什么写candlestick类型就报错
  19. 小妖精的完美游戏教室——东方PROJECT,同人,墙
  20. Adding ASP.NET MVC5 Identity Authentication to an existing project

热门文章

  1. Callable线程
  2. Linux 常用检测命令
  3. 让你的 EditText 所有清除
  4. Android四大组件与进程启动的关系(转)
  5. Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
  6. 【SICP练习】149 练习4.5
  7. 嵌入式开发之davinci--- DVRRDK, EZSDK和DVSDK这三者有什么区别
  8. UITableViewController的子控件不随着滑动
  9. [LeetCode]Two Sum 【Vector全局指针的使用】
  10. 2016/2/29 html 思维导图