POJ 2112 - Optimal Milking

时间:2021-10-30 07:19:53

原题地址:http://poj.org/problem?id=2112

题目大意:有K个挤奶机(标号为1 ~ K)和C头奶牛(编号为K + 1 ~ K + C),以邻接矩阵的方式给出它们两两之间的距离,每个挤奶机最多能挤M头奶牛的奶,求一种紧挨方案使得所有挤奶机到奶牛的距离的最大值最小

数据范围和一些细节:1 <= K <= 30, 1 <= C <= 200, 1 <= M <= 15, 每条边的长度L 满足 1 <= L <= 200。两点之间如果没有直接连接的边,则在邻接矩阵中给出"0"。邻接矩阵的一行可能会断成多行

题目分析:

这道题和昨天那道2455大同小异,都是使路径长最大值最小。不同的是,2455那道题要求的是路径上的某一条最长边的长度最小,而这道题是满足两点之间的路径长的最大值最小。所以这道题先用Floyd算法预处理出每对顶点之间的最短路,然后二分答案k,将距离小于k的两点之间连容量为1的边,反向边容量为0(注意,在这里连边的时候只能连接挤奶机和奶牛,不能连其它边,我在这里WA了几次)。最后新建源点和汇点,从源点向每台挤奶机连接容量为M的边,从每头奶牛向汇点连接容量为1的边,判断最大流是否等于C。

 //date 20140119
#include <cstdio>
#include <cstring> const int maxn = ;
const int maxm = ;
const int INF = ; inline int getint()
{
int ans(); char w = getchar();
while('' > w || w > '')w = getchar();
while('' <= w && w <= '')
{
ans = ans * + w - '';
w = getchar();
}
return ans;
} inline int min(int a, int b){return a < b ? a : b;}
inline int max(int a, int b){return a > b ? a : b;} int K, C, M;
int n;
int map[maxn][maxn]; struct edge
{
int v, c, next;
}E[maxm];
int s, t;
int a[maxn], now[maxn];
int lab[maxn];
int nedge; inline void add(int u, int v, int c)
{
E[++nedge].v = v;
E[nedge].c = c;
E[nedge].next = a[u];
a[u] = nedge;
} inline void floyd()
{
for(int k = ; k <= n; ++k)
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j)
{
if(i == k || j == k || i == j)continue;
map[i][j] = min(map[i][j], map[i][k] + map[j][k]);
}
} inline int label()
{
static int q[maxn];
int l = , r = ;
memset(lab, 0xFF, sizeof lab);
q[] = s; lab[s] = ;
while(l < r)
{
int x = q[++l];
for(int i = a[x]; i; i = E[i].next)
if(E[i].c > && lab[E[i].v] == -)
{
lab[E[i].v] = lab[x] + ;
q[++r] = E[i].v;
}
}
return lab[t] != -;
} int Dinic(int v, int f)
{
if(v == t)return f;
int res = , w;
for(int i = now[v]; i; now[v] = i = E[i].next)
if((f > ) && (E[i].c > ) && (lab[E[i].v] == lab[v] + ) && (w = Dinic(E[i].v, min(E[i].c, f))))
{
E[i].c -= w;
E[i ^ ].c += w;
res += w;
f -= w;
if(f == )break;
}
return res;
} inline int max_flow()
{
int ans = ;
while(label())
{
for(int i = ; i <= t; ++i)now[i] = a[i];
ans += Dinic(s, INF);
}
return ans;
} inline bool check(int mid)
{
memset(a, , sizeof a);
nedge = ;
for(int i = ; i <= K; ++i)
for(int j = K + ; j <= n; ++j)
if(map[i][j] <= mid){add(i, j, ); add(j, i, );} for(int i = ; i <= K; ++i){add(s, i, M); add(i, s, );}
for(int i = ; i <= C; ++i){add(i + K, t, ); add(t, i + K, );}
return (max_flow() == C) ;
} inline int solve(int l, int r)
{
int mid;
while(l < r)
{
mid = (l + r) >> ;
if(check(mid))r = mid;
else l = mid + ;
}
return l;
} int main()
{
K = getint(); C = getint(); M = getint();
n = K + C; s = n + ; t = n + ;
int minl = INF, maxl = ;
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j)
{
map[i][j] = getint();
if(map[i][j] == )map[i][j] = INF;
}
floyd();
for(int i = ; i <= K; ++i)
for(int j = K + ; j <= n; ++j)
{
if(map[i][j] == INF)continue;
minl = min(minl, map[i][j]);
maxl = max(maxl, map[i][j]);
}
int ans = solve(minl, maxl);
printf("%d\n", ans);
return ;
}

一直想写SGU187一直也没写过……求各位指点

POJ 2112 - Optimal Milking的更多相关文章

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

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

  2. POJ 2112 Optimal Milking (二分 &plus; floyd &plus; 网络流)

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

  3. Poj 2112 Optimal Milking &lpar;多重匹配&plus;传递闭包&plus;二分&rpar;

    题目链接: 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 &lpar;二分 &plus; 最大流&rpar;

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

  6. POJ 2112 Optimal Milking (Dinic &plus; Floyd &plus; 二分)

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

  7. POJ 2112 Optimal Milking(最大流)

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

  8. POJ 2112 Optimal Milking(二分&plus;最大流)

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

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

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

随机推荐

  1. DotNetBar grid筛选 按时间筛选

    PatientDiaryPanel.Columns["RECORDDATE"].FilterExpr = string.Format("date(RECORDDATE) ...

  2. spring4&period;2&period;3&plus;mybatis&plus;spring-security配置文件

    1.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&qu ...

  3. openmpi出现Segmentation Fault而终止运算

    欢迎关注我的社交账号: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://gith ...

  4. JS原型链原理(链表)

      任何一个对象都有一个prototype的属性,在js中可以把它记为:__proto__   当初ECMAscript的发明者为了简化这门语言,同时又保持继承的属性,于是就设计了这个链表..在数据结 ...

  5. lintcode &colon;sort letters by case字符大小写排序

    题目 字符大小写排序 给定一个只包含字母的字符串,按照先小写字母后大写字母的顺序进行排序. 您在真实的面试中是否遇到过这个题? Yes 样例 给出"abAcD",一个可能的答案为& ...

  6. doubleclick cookie、动态脚本、用户画像、用户行为分析和海量数据存取 推荐词 京东 电商 信息上传 黑洞 https&colon;&sol;&sol;blackhole&period;m&period;jd&period;com&sol;getinfo

    doubleclick cookie https://mp.weixin.qq.com/s/vZUj-Z9FGSSWXOodGqbYkA 揭密Google的网络广告技术:基于互联网大数据视角 原创:  ...

  7. django中数据库操作有关部分

    # >>>>>>>>>>>>>>>>>>>>>>>>&g ...

  8. AppBox中,如何在用户管理页面显示用户所属的多个角色?

    <f:TemplateField Width="200px" HeaderText="角色">    <ItemTemplate>    ...

  9. vs2015 调试IIS

    vs2015 调试IIS vs2015,menu,调试>附加到进程>w3wp 然后用浏览器打开网页,单步调试跟踪. http://blog.csdn.net/hyperhawk/artic ...

  10. apicloud api&period;openwin

    简单介绍api.openWin: 打开window 若window已存在,则会把该window显示到最前面,同时若url有变化或者reload参数为true时,页面会重新加载.若当前正在进行openW ...