题目链接

测试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. [BZOJ]1016 JSOI2008 最小生成树计数

    最小生成树计数 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同 ...

  2. HDU 1003 Max Sum

    Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  3. SQL单表查询

    --1,选择不猛30中的雇员 SELECT * FROM EMP WHERE DEPTNO = 30; --2,列出所有办事员的姓名,编号和部门 SELECT ENAME,EMPNO,DEPTNO F ...

  4. IncDec Sequence(codevs 2098)

    题目描述 Description 给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一. 问至少需要多少次操作才能使数列中的所有数都一样,并 ...

  5. Popular Cows(codevs 2186)

    题意: 有N(N<=10000)头牛,每头牛都想成为most poluler的牛,给出M(M<=50000)个关系,如(1,2)代表1欢迎2,关系可以传递,但是不可以相互,即1欢迎2不代表 ...

  6. 最新版Duilib在VS2012下编译错误的解决方法

            svn了好几次最新版本的项目源代码, 在VS2012下编译老是出错, 改了后没记录, 结果又忘记, 所以在此记录下.        这个问题很普遍, 非常多的人遇到.       至于 ...

  7. Groovy安装配置

    一.介绍 Groovy是可以运行在 Java 平台上进行动态语言,使用方式基本与使用 Java 的方式相同,Groovy和java基本是可以实现无缝整合,它有以下一些特性: 是一个基于Java虚拟机的 ...

  8. jstack命令(Java Stack Trace)

    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使 ...

  9. hdu 4622 **

    题意:Suppose there are the symbols M, I, and U which can be combined to produce strings of symbols cal ...

  10. mysql错误:“ Every derived table must have its own alias”(每个派生出来的表都必须有一个自己的别名)

    自我感悟: 由此可以延伸,我们得到一个结果集,可以通过as XXX的方式,把结果集给当作一张表来用,以实现子查询: 一般在多表查询时,会出现此错误. 因为,进行嵌套查询的时候子查询出来的的结果是作为一 ...