●题目大意:

给出K个挤奶机器(编号1~K),C头牛(编号K+1~K+C)(机器和牛各在不同的地方)和每台机器最多可M头牛挤奶;

然后以邻接矩阵告诉各点间的直接距离(不同的地方间若直接距离等于0,则表明没有直接连路)。

目的是要让每一头牛都要去一台机器处被挤奶,要使行走路程最大的牛的路程最小。goto

●题解:

刚拿到题时很Mengbi,搞了一段时间后才发现每个点可以去多次……

因为点数只有不超过230个,那么我们可以求出每个牛到每个机器的最短距离(自然是floyd嘛),那么问题变成了将牛分配至机器,不同的牛分配到不同的机器有不同的代价(即计算出的最短距离),且每个机器的能接受的牛的数量有限,要求出最大代价的最小值(明摆着套路二分答案嘛)。

至此,思路渐渐清晰,先floyd求每个牛到每个机器的最短距离,然后二分答案(lim 表示),开始建图,跑网络流;

建图&网络流(对于每一个二分出来的lim):

1、源点 s 向各头牛连一条容量为1的有向边;

2、枚举牛和机器的”组合“,若 A 牛到 B 机器的(最短)距离小于 lim ,则从 A 向 B 连一条容量为 inf(只要容量大于0即可) 的有向边;

3、从各机器向源点 E 连一条容量为1的有边;

4、用最大流求图中的流量,若流量等于牛的数量,就,咳咳.…..

总:floyd+二分+最大流

#include<cstdio>
#include<cstring>
#include<iostream>
#define oo (0x3f3f3f3f)
using namespace std;
struct edge{
int to,next,cap;
}e[250*250*2];
int mp[250][250],head[250],q[250],d[250];
int k,c,m,l=+oo,r=-1,mid,ent;
void add(int u,int v,int cap){
e[ent]=(edge){v,head[u],cap};head[u]=ent++;
e[ent]=(edge){u,head[v],0};head[v]=ent++;
}
bool bfs(int s,int t)
{
int ll=0,rr=1; q[rr]=s;
memset(d,0,sizeof(d)); d[s]=1;
while(ll<rr)
{
ll++; int u=q[ll];
for(int i=head[u];~i;i=e[i].next) if(e[i].cap>0)
{
int v=e[i].to; if(d[v]) continue;
d[v]=d[u]+1; q[++rr]=v;
}
}
return d[t];
}
int dfs(int u,int t,int flow)
{
if(u==t) return flow; int flowout=0,f;
for(int i=head[u];i!=-1;i=e[i].next)
{
int v=e[i].to;
if(d[v]!=d[u]+1) continue;
f=dfs(v,t,min(flow,e[i].cap));
flowout+=f; flow-=f;
e[i].cap-=f; e[i^1].cap+=f;
if(flow==0) break;
}
return flowout;
}
bool check(int s,int t)
{
memset(head,-1,sizeof(head));ent=0;
for(int i=k+1;i<=k+c;i++)
for(int j=1;j<=k;j++)
if(mp[i][j]>-1&&mp[i][j]<=mid) add(i,j,1);
for(int i=k+1;i<=k+c;i++) add(s,i,1);
for(int i=1;i<=k;i++) add(i,t,m);
int flow=0;
while(bfs(s,t)) flow+=dfs(s,t,+oo);
return flow==c;
}
void solve(int s,int t)
{
int ans=0;
while(l<=r)
{
mid=(l+r)/2;
if(check(s,t)) ans=mid,r=mid-1; else l=mid+1;
}
printf("%d",ans);
}
void floyd()
{
for(int o=1;o<=k+c;o++)
for(int i=1;i<=k+c;i++)
for(int j=1;j<=k+c;j++)
if(mp[i][o]>-1&&mp[o][j]>-1&&(mp[i][j]==-1||mp[i][o]+mp[o][j]<mp[i][j]))
mp[i][j]=mp[i][o]+mp[o][j];
for(int i=k+1;i<=k+c;i++)
for(int j=1;j<=k;j++)
l=0,r=max(r,mp[i][j]);
}
int main()
{
scanf("%d%d%d",&k,&c,&m);
memset(mp,-1,sizeof(mp));
for(int i=1;i<=k+c;i++) for(int j=1;j<=k+c;j++)
{
scanf("%d",&mp[i][j]);
if(mp[i][j]==0&&i!=j) mp[i][j]=-1;
}
floyd(); solve(0,k+c+1);
return 0;
}

●POJ poj 2112 Optimal Milking的更多相关文章

  1. POJ 2112 Optimal Milking (二分+最短路径+网络流)

    POJ  2112 Optimal Milking (二分+最短路径+网络流) Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K To ...

  2. POJ 2112 Optimal Milking (二分 + floyd + 网络流)

    POJ 2112 Optimal Milking 链接:http://poj.org/problem?id=2112 题意:农场主John 将他的K(1≤K≤30)个挤奶器运到牧场,在那里有C(1≤C ...

  3. Poj 2112 Optimal Milking (多重匹配+传递闭包+二分)

    题目链接: Poj 2112 Optimal Milking 题目描述: 有k个挤奶机,c头牛,每台挤奶机每天最多可以给m头奶牛挤奶.挤奶机编号从1到k,奶牛编号从k+1到k+c,给出(k+c)*(k ...

  4. POJ 2112—— Optimal Milking——————【多重匹配、二分枚举答案、floyd预处理】

    Optimal Milking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Sub ...

  5. POJ 2112 Optimal Milking (Dinic + Floyd + 二分)

    Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 19456   Accepted: 6947 ...

  6. POJ 2112 Optimal Milking(最大流)

    题目链接:http://poj.org/problem?id=2112 Description FJ has moved his K (1 <= K <= 30) milking mach ...

  7. POJ 2112 - Optimal Milking

    原题地址:http://poj.org/problem?id=2112 题目大意:有K个挤奶机(标号为1 ~ K)和C头奶牛(编号为K + 1 ~ K + C),以邻接矩阵的方式给出它们两两之间的距离 ...

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

    题目大意: 在一个农场里面,有k个挤奶机,编号分别是 1..k,有c头奶牛,编号分别是k+1 .. k+c,每个挤奶机一天最让可以挤m头奶牛的奶,奶牛和挤奶机之间用邻接矩阵给出距离.求让所有奶牛都挤到 ...

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

    http://poj.org/problem?id=2112 题意: 现在有K台挤奶器和C头奶牛,奶牛和挤奶器之间有距离,每台挤奶器每天最多为M头奶挤奶,现在要安排路程,使得C头奶牛所走的路程中的最大 ...

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

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

随机推荐

  1. python实现K聚类算法

    参考:<机器学习实战>- Machine Learning in Action 一. 基本思想  聚类是一种无监督的学习,它将相似的对象归到同一簇中.它有点像全自动分类.聚类方法几乎可以应 ...

  2. PTA題目的處理(一)

    **題目1:A乘B** **實驗代碼** #include <stdio.h> #include <stdlib.h> int main() { signed int a,b; ...

  3. 201621123057 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 在上一周的总结上做了一点补充 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1. ...

  4. Hibernate之ORM与Hibernate

    ORM: ORM是 Object /Relation Mapping,对象/关系数据库映射. 目前比较流行的编程语言,如java ,c#等,它们都是面向对象的编程语言,而目前比较主流的数据库产品,如O ...

  5. 服务器数据恢复方法_存储raid硬盘离线数据恢复案例

    [故障描述]某法院的一台HP-P4500的存储系统,底层是12块1TB的硬盘组的RAID.其中每6个1TB的盘一组,第一组的前面一部分组了一个RAID0+1,是存放HP-P4500嵌入式系统,接着组了 ...

  6. C#中的函数式编程:递归与纯函数(二)

    在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential transparency)来定义的.如果一个 ...

  7. 【Learning】 多项式的相关计算

    约定的记号 对于一个多项式\(A(x)\),若其最高次系数不为零的项是\(x^k\),则该多项式的次数为\(k\). 记为\(deg(A)=k\). 对于\(x\in(k,+ \infty)\),称\ ...

  8. 剑指offer-删除链表中重复的节点

    题目描述   在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处 ...

  9. Python-socket网络编程-Day8

    目录Day8-Python socket 11.Socket 11.1.socket和file的区别: 11.2.WEB服务应用: 21.3.更多功能 21.4.socket方法: 41.5. 服务端 ...

  10. maven常见问题处理(3-3)Gradle编译时下载依赖失败解决方法

    Gradle编译时在本地仓库中如果没有发现依赖,就会从远程仓库中下载, 默认的远程仓库为 mavenCentral(),即 http://repo1.maven.org/maven2/往往访问速度特别 ...