Optimal Milking---poj2112(多重匹配+Floyd+二分)
题目链接:http://poj.org/problem?id=2112
题意:K个挤奶器(编号1~K),每个挤奶器每天最多供M头奶牛。共有C头奶牛(编号K+1~K+C)。挤奶器和奶牛间有不同长度的路。
编写程序,寻找一个方案,安排每头牛到某个挤奶器挤奶,并使得C头奶牛需要走的所有路程的最大路程最小。答案可以用二分来找;
一对多的二分图的多重匹配。二分图的多重匹配算法的实现类似于匈牙利算法,对于集合x中的元素xi,找到一个与其相连的元素yi后(本题中要满足相连并且距离要小于某个距离),检查匈牙利算法的两个条件是否成立,若yi未被匹配,则将
xi,yi匹配。否则,如果与yi匹配的元素已经达到上限,那么在所有与yi匹配的元素中选择一个元素,检查是否能找到一条增广路径,如果能,则让出位置,让xi与yi匹配。
Cows can traverse several paths on the way to their milking machine. 这句话说明了牛可以通过任何路径到达挤奶机,所以要用Floyd更新距离;
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<string>
#include<stack>
#include<map>
using namespace std;
#define N 1510
#define INF 0x3f3f3f3f
#define met(a, b) memset(a, b, sizeof(a)) int G[N][N], vis[N];
int M, K, C; struct node
{
int k;
int a[N];
}Linky[N]; void Floyd()
{
for(int k=; k<=K+C; k++)
for(int i=; i<=K+C; i++)
for(int j=; j<=K+C; j++)
G[i][j] = min(G[i][j], G[i][k]+G[k][j]);
} bool Find(int u, int Limit)
{
for(int i=; i<=K; i++)
{
if( !vis[i] && G[u][i] <= Limit)///距离应在Limit范围之内;
{
vis[i] = ;
if( Linky[i].k < M )///当与i相连的点的个数小于M个时,直接放进来;
{
Linky[i].a[ Linky[i].k++ ] = u;
return true;
}
for(int j=; j<Linky[i].k; j++)///否则就看是否能替换掉其中的一个
{
if(Find(Linky[i].a[j], Limit))
{
Linky[i].a[j] = u;
return true;
}
}
}
}
return false;
} bool Hungary(int Limit)
{
met(Linky, );
for(int i=K+; i<=K+C; i++)
{
met(vis, );
if( !Find(i, Limit) )///当有一个牛找不到与之相对的挤奶机时,就说明这个Limit不符合条件;
return false;
}
return true;
} int solve()
{
int L = , R = INF, ans = INF;
while(L <= R)
{
int Mid = (L+R)/;
if(Hungary(Mid))
{
ans = Mid;///不断更新符合条件的答案;
R = Mid-;
}
else
L = Mid+;
}
return ans;
} int main()
{
while(scanf("%d %d %d", &K, &C, &M) != EOF)
{
met(G, ); for(int i=; i<=K+C; i++)
{
for(int j=; j<=K+C; j++)
{
scanf("%d", &G[i][j]);
if(G[i][j] == ) G[i][j] = INF;
}
} Floyd();///Floyd求出,各点之间的距离; int ans = solve(); printf("%d\n", ans);
}
return ;
}
Optimal Milking---poj2112(多重匹配+Floyd+二分)的更多相关文章
- POJ 2112—— Optimal Milking——————【多重匹配、二分枚举答案、floyd预处理】
Optimal Milking Time Limit:2000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64u Sub ...
- POJ2112 Optimal Milking —— 二分图多重匹配/最大流 + 二分
题目链接:https://vjudge.net/problem/POJ-2112 Optimal Milking Time Limit: 2000MS Memory Limit: 30000K T ...
- POJ 2112 Optimal Milking ( 经典最大流 && Floyd && 二分 )
题意 : 有 K 台挤奶机器,每台机器可以接受 M 头牛进行挤奶作业,总共有 C 头奶牛,机器编号为 1~K,奶牛编号为 K+1 ~ K+C ,然后给出奶牛和机器之间的距离矩阵,要求求出使得每头牛都能 ...
- POJ 3189——Steady Cow Assignment——————【多重匹配、二分枚举区间长度】
Steady Cow Assignment Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I ...
- Poj 2112 Optimal Milking (多重匹配+传递闭包+二分)
题目链接: Poj 2112 Optimal Milking 题目描述: 有k个挤奶机,c头牛,每台挤奶机每天最多可以给m头奶牛挤奶.挤奶机编号从1到k,奶牛编号从k+1到k+c,给出(k+c)*(k ...
- poj 2112 Optimal Milking (二分图匹配的多重匹配)
Description FJ has moved his K ( <= K <= ) milking machines <= C <= ) cows. A ..K; the c ...
- POJ3189_Steady Cow Assignment(二分图多重匹配/网络流+二分构图)
解题报告 http://blog.csdn.net/juncoder/article/details/38340447 题目传送门 题意: B个猪圈,N头猪.每头猪对每一个猪圈有一个惬意值.要求安排这 ...
- POJ 2289——Jamie's Contact Groups——————【多重匹配、二分枚举匹配次数】
Jamie's Contact Groups Time Limit:7000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I ...
- N - Optimal Milking - POJ 2112(二分图多重匹配+Floyd+二分搜索)
题意:有K太挤奶机,C头奶牛,每个挤奶机每天只能为M头奶牛服务,下面给的K+C的矩阵,是形容相互之间的距离,求出来走最远的那头奶牛要走多远 分析:应该先使用floyd求出来点之间的最短路??(不晓得给 ...
随机推荐
- Erlang TCP Socket的接收进程的2种方案
转自:http://blog.csdn.net/summerhust/article/details/8740973 一旦打开了一个使用TCP连接的套接字,它就始终保持打开状态,直至任何一方关闭它或因 ...
- par函数的ann 参数-控制图片的注释信息
ann 参数控制图片的x轴和y轴标签以及标题是否显示 默认值为TRUE, 所以图片有对应的信息时,会显示出来,代码示例 plot(1:5, 1:5, main = "title", ...
- R read.table函数的check.names参数
今天用cummeRbund 对cuffdiff的结果进行可视化, 一直报错,之前跑的好好的,找了半天原因, 原来出现在read.table这个函数上: read.table有一个参数check.nam ...
- 怎么快速了解自己的MySQL服务器?
From: http://www.cnblogs.com/benshan/archive/2013/01/09/2853097.html 1.查看数据库服务器状态:status Linux 下的MyS ...
- ueditor1_4_3_3编辑器修改文章
html的body中: <script id="editor" type="text/plain" ></script> js中: // ...
- sqlldr导入数据(以PostgreSql>>>Oracle为例)
1.在目标数据库中创建表 1.1点击源表,复制创建语句 1.2 修改数据类型以匹配目标数据库,如: 字符串类型:character varying(20)>>>varchar2(20 ...
- 调整swap分区大小-Linux下安装Oracle时报swap不够解决方法
调整swap分区大小 方法一:如果磁盘有剩余的空间,用分区工具新建一个swap分区.并写到/etc/fstab里面.再 #swapon -a方法二:可以用一个文件做交换分区. su root cd / ...
- mongodb group php 操作
紧接着上篇来,这篇主要讲,mongodb的group功能,做的还是挺强大的,相当对于find(),skip(),distinct()等,用法比较复杂. 测试数据 > db.fruit.find( ...
- 我的javascript心跳机
li { list-style: none!important; padding:0; } .list_num{ list-style-type:decimal; } .list_inline{ ma ...
- 超全面的JavaWeb笔记day10<Response&Request&路径&编码>
1.Response 2.Request 3.路径 4.编码 请求响应流程图 response 1.response概述 response是Servlet.service方法的一个参数,类型为java ...