思路:这题跟 poj 3228 Gold Transportation(二分+最大流)
这题差不多,就是用二分求出满足条件下的最小边权 EK超时,此题用sap做的
//3212K
797MS
#include <stdio.h>
#include <string.h>
#define VM 210
#define EM
160010
//建边重复1遍,所以是4*40000
int head[VM],oldhead[VM],dep[VM],gap[VM],cur[VM],pre[VM];
int e1,e,n,p,t,src,des;
struct E
{
to,cap,nxt;
}edge[EM],oldedge[EM];
void addedge1 (int cu,int cv,int cw)
{
oldedge[e1].to = cv;
oldedge[e1].cap = cw;
oldedge[e1].nxt = oldhead[cu];
= e1 ++;
}
void addedge (int cu,int cv,int cw)
{
cv;
= cw;
= head[cu];
++;
}
void Build (int num)
{
(head,-1,sizeof(head));
1;u <= n;u ++)
for (int i = oldhead[u];i != -1;i = oldedge[i].nxt)
{
int v = oldedge[i].to;
if (oldedge[i].cap <= num)
{
addedge
(u,v,1);
//边权为1就可以了
addedge (v,u,1);
}
}
}
int Sap ()
{
(dep,0,sizeof(dep));
(gap,0,sizeof(gap));
(cur,head,sizeof(head));
pre[src] = src;
0;
n;
(dep[src] < n)
for (int &i = cur[u];i != -1;i = edge[i].nxt)
{
int v = edge[i].to;
if (edge[i].cap && dep[u] == dep[v]
+ 1)
{
pre[v] = u;