Poj 2112 Optimal Milking (多重匹配+传递闭包+二分)
2024-08-29 01:50:33
题目链接:
题目描述:
有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 ;
}
最新文章
- linux基本知识
- db2无法force掉备份连接的处理办法
- 【转】缺少servlet-api.jar包
- Android线程之主线程向子线程发送消息
- dialogic d300语音卡驱动重装后启动报错问题解决方法
- Web Browser使用技巧
- Git stash方法(转)
- 各浏览器各版本User-agent汇总 欢迎补充
- js给数字加三位一逗号间隔的两种方法(面试题)
- selenium webdriver 环境搭建--java
- OneToMany与ManyToOne的属性
- 使用接口的方式调用远程服务 ------ 利用动态调用服务,实现.net下类似Dubbo的玩法。
- Python3.4入门之ifelse错误解决方案
- AngularJS学习篇(九)
- Subscription wildcards(MQTT)
- Java 并发编程:volatile的使用及其原理
- [MNIST数据集]输入图像的预处理
- echarts绘制k线图为什么写candlestick类型就报错
- 小妖精的完美游戏教室——东方PROJECT,同人,墙
- Adding ASP.NET MVC5 Identity Authentication to an existing project
热门文章
- Callable线程
- Linux 常用检测命令
- 让你的 EditText 所有清除
- Android四大组件与进程启动的关系(转)
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- 【SICP练习】149 练习4.5
- 嵌入式开发之davinci--- DVRRDK, EZSDK和DVSDK这三者有什么区别
- UITableViewController的子控件不随着滑动
- [LeetCode]Two Sum 【Vector全局指针的使用】
- 2016/2/29 html 思维导图