只有能满足他的要求时他才会接服务 求最大能满足多少人?
思路:网络流 建一超级源点 汇点 源点与食物相连 边权为其数量,汇点与饮料相连 边权也为其数量 把人分成两个点 之间的边权为1
每个人与之需要的食物和饮料相连 边权为1
////125MS
2136K
#include <stdio.h>
#include <string.h>
#define VM
1000
#define EM
200000
#define inf 0x3f3f3f3f
struct E
{
to,cap,nxt;
} edge[EM];
int head[VM],gap[VM],dist[VM],cur[VM],pre[VM];
int ep,src,des,n;
void addedge (int cu,int cv,int cw)
{
= cv;
= cw;
= head[cu];
ep;
= cu;
= 0;
= head[cv];
ep;
}
int min (int a ,int b)
{
> b ? b : a;
}
int sap ()
{
(dist,0,sizeof(dist));
(gap,0,sizeof (dist));
(cur,head,sizeof(dist));
0;
pre[src] = src;
inf;
n;
(dist[src] < n)
loop:
for (int &i = cur[u]; i != -1; i =
edge[i].nxt)
{
int v = edge[i].to;
if (edge[i].cap && dist[u] ==
dist[v] + 1)
{
aug = min (aug,edge[i].cap);
pre[v] = u;
u = v;
if (v == des)
{
res += aug;
for (u = pre[u]; v != src; v = u,u = pre[u])