题目链接

测试dinic模版,不知道这个模版到底对不对,那个题用这份dinic就是过不了。加上优化就WA,不加优化TLE。

 #include <cstdio>
#include <string>
#include <cstring>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;
#define INF 0x3ffffff
struct node
{
int u,v,next,re,w;
} edge[];
int first[],dis[];
int p[][];
int t;
int sv,ev,K,C,M;
void CL()
{
t = ;
memset(first,-,sizeof(first));
}
void add(int u,int v,int w)
{
edge[t].u = u;
edge[t].v = v;
edge[t].w = w;
edge[t].re = t+;
edge[t].next = first[u];
first[u] = t++;
edge[t].u = v;
edge[t].v = u;
edge[t].w = ;
edge[t].re = t-;
edge[t].next = first[v];
first[v] = t ++;
}
int bfs()
{
int u,v,i;
memset(dis,0xff,sizeof(dis));
queue<int> que;
que.push(sv);
dis[sv] = ;
while(!que.empty())
{
u = que.front();
que.pop();
for(i = first[u]; i != -; i = edge[i].next)
{
v = edge[i].v;
if(edge[i].w > &&dis[v] < )
{
dis[v] = dis[u] + ;
que.push(v);
}
}
}
if(dis[ev] > ) return ;
else return ;
}
int dfs(int u,int step)
{
int i,a = ,v,flag = ;
if (u == ev) return step;
for (i = first[u];i != -&&flag < step; i = edge[i].next)//flag<step
{
v = edge[i].v;
if (edge[i].w > && dis[v] == dis[u]+&&(a = dfs(v,min(step,edge[i].w))))
{
edge[i].w -= a;
flag += a;//这里
edge[edge[i].re].w += a;
return a;
}
}
if(flag == ) dis[u] = -;//这里
return flag;
}
void build(int x)
{
int i,j;
CL();
for(i = ; i <= K; i ++)
{
add(,i,M);
}
for(i = ; i <= K; i ++)
{
for(j = ; j <= C; j ++)
{
if(p[i][j+K] <= x)
add(i,K+j,);
}
}
for(i = ;i <= C;i ++)
{
add(i+K,ev,);
}
}
int fun(int x)
{
int ans = ,res;
build(x);
while(bfs())
{
while(res=dfs(sv,INF))
ans += res;
}
if(ans == C)
return ;
else
return ;
}
int bin(int l,int r)
{
int str,mid,end;
str = l;
end = r;
while(str < end)
{
mid = (str + end)/;
if(fun(mid))
{
end = mid;
}
else
{
str = mid + ;
}
}
return end;
}
int main()
{
int i,j,k;
while(scanf("%d%d%d",&K,&C,&M)!=EOF)
{
for(i = ;i <= K+C;i ++)
{
for(j = ;j <= K+C;j ++)
{
scanf("%d",&p[i][j]);
if(i != j&&p[i][j] == )
p[i][j] = INF;
}
}
for(i = ;i <= K+C;i ++)
{
for(j = ;j <= K+C;j ++)
{
for(k = ;k <= K+C;k ++)
{
if(p[j][k] > p[j][i] + p[i][k])
p[j][k] = p[j][i] + p[i][k];
}
}
}
sv = ;
ev = K+C+;
int maxz = ;
for(i = ;i <= K+C;i ++)
{
for(j = ;j <= K+C;j ++)
maxz = max(maxz,p[i][j]);
}
printf("%d\n",bin(,maxz));
}
return ;
}

POJ 2112 Optimal Milking(最大流+二分)的更多相关文章

  1. POJ 2112 Optimal Milking【网络流+二分+最短路】

    求使所有牛都可以被挤牛奶的条件下牛走的最长距离. Floyd求出两两节点之间的最短路,然后二分距离. 构图: 将每一个milking machine与源点连接,边权为最大值m,每个cow与汇点连接,边 ...

  2. POJ 2112 Optimal Milking 最短路 二分构图 网络流

    题意:有C头奶牛,K个挤奶站,每个挤奶器最多服务M头奶牛,奶牛和奶牛.奶牛和挤奶站.挤奶站和挤奶站之间都存在一定的距离.现在问满足所有的奶牛都能够被挤奶器服务到的情况下,行走距离的最远的奶牛的至少要走 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. POJ 2112.Optimal Milking (最大流)

    时间限制:2s 空间限制:30M 题意: 有K台挤奶机(编号1~K),C头奶牛(编号K+1~K+C),给出各点之间距离.现在要让C头奶牛到挤奶机去挤奶,每台挤奶机只能处理M头奶牛,求使所走路程最远的奶 ...

随机推荐

  1. poj1753枚举

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33670   Accepted: 14713 Descr ...

  2. Encode and Decode Strings

    Design an algorithm to encode a list of strings to a string. The encoded string is then sent over th ...

  3. 【leetcode】Longest Consecutive Sequence

    Longest Consecutive Sequence Given an unsorted array of integers, find the length of the longest con ...

  4. iOS 转载一篇利用dispatch_once创建单例的文章

    感谢文章原作者,http://bj007.blog.51cto.com/1701577/649413

  5. 借助magicwindow sdk plugin快速集成sdk

    到目前为止,Android Studio已经是开发原生Android App的主流IDE,它是由Google官方设计并基于JetBrains的IntelliJ IDEA.我们魔窗开发的sdk也是使用此 ...

  6. [Android Pro] 横竖屏切换时,禁止activity重新创建,android:configChanges="keyboardHidden|orientation" 不起作用

    referece to : http://blog.csdn.net/mybook1122/article/details/24978025 这个网上搜索,很多结果都是: AndroidManifes ...

  7. 自定义Notification

    private static void updateProgressNotification(Context cxt, int appsCount, int percent, String appNa ...

  8. Genesis自动登录方法(免输入用户名和密码)

    第一步:点击“我的电脑”右键属性在“高级”里面的“环境变量”里面把“系统变量”照下图所示新建(XP和WIN7的环境变量设置方法类似): 变量名:FRONTLINE_NO_LOGIN_SCREEN 变量 ...

  9. Android之Fragment(二)

    本文主要内容 如何管理Fragment回退栈 Fragment如何与Activity交互 Fragment与Activity交互的最佳实践 没有视图的Fragment的用处 使用Fragment创建对 ...

  10. .NET委托解析

    委托这个概念其实我们都很熟悉了,但是在使用的时候很多人还是无法去把控它,我们可以试想一下,在平时编码的时候,你是直接按照业务逻辑直接创建类,new出一个对象来进行操作的还是说有用到委托来更高效的完成一 ...