HDU 4292 Food(网络流)
来源:互联网 发布:ar9565 linux 编辑:程序博客网 时间:2024/06/07 06:09
题意:有F种食物 D种饮料 它们都有一定的数量 有N个人 每个人都有自己喜欢吃的食物和饮料 (每个人至少要一种食物和饮料)只有能满足他的要求时他才会接服务 求最大能满足多少人?
思路:网络流 建一超级源点 汇点 源点与食物相连 边权为其数量,汇点与饮料相连 边权也为其数量 把人分成两个点 之间的边权为1每个人与之需要的食物和饮料相连 边权为1
////125MS 2136K
#include <stdio.h>
#include <string.h>
#define VM 1000
#define EM 200000
#define inf 0x3f3f3f3f
struct E
{
intto,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)
{
edge[ep].to= cv;
edge[ep].cap= cw;
edge[ep].nxt= head[cu];
head[cu] =ep;
ep ++;
edge[ep].to= cu;
edge[ep].cap= 0;
edge[ep].nxt= head[cv];
head[cv] =ep;
ep ++;
}
int min (int a ,int b)
{
return a> b ? b : a;
}
int sap ()
{
memset(dist,0,sizeof(dist));
memset(gap,0,sizeof (dist));
memcpy(cur,head,sizeof(dist));
int res =0;
int u =pre[src] = src;
int aug =inf;
gap[0] =n;
while(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])
思路:网络流 建一超级源点 汇点 源点与食物相连 边权为其数量,汇点与饮料相连 边权也为其数量 把人分成两个点 之间的边权为1每个人与之需要的食物和饮料相连 边权为1
////125MS
#include <stdio.h>
#include <string.h>
#define VM
#define EM
#define inf 0x3f3f3f3f
struct E
{
} 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)
{
}
int min (int a ,int b)
{
}
int sap ()
{
loop: