现在的位置: 首页 > 综合 > 正文

HDU 4292 Food(网络流)

2017年12月13日 ⁄ 综合 ⁄ 共 1146字 ⁄ 字号 评论关闭
题意:有F种食物 D种饮料 它们都有一定的数量 有N个人 每个人都有自己喜欢吃的食物和饮料 (每个人至少要一种食物和饮料)
只有能满足他的要求时他才会接服务 求最大能满足多少人?

思路:网络流 建一超级源点 汇点 源点与食物相连 边权为其数量,汇点与饮料相连 边权也为其数量 把人分成两个点 之间的边权为1
每个人与之需要的食物和饮料相连 边权为1 

////125MS   
2136K

#include <stdio.h>
#include <string.h>
#define VM   
1000
#define EM   
200000
#define inf 0x3f3f3f3f
struct E
{
    int
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)
{

    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])
                

抱歉!评论已关闭.