hdu 4292 Food 拆點網路流

2021-07-04 16:39:16 字數 1750 閱讀 8849

解法:拆人

**:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 50010;//點數的最大值

const

int maxm = 90001000;//邊數的最大值

const

int inf = 0x3f3f3f3f;

struct edge

edge[maxm];//注意是maxm

int tol;

int head[maxn];

int gap[maxn], dep[maxn], pre[maxn], cur[maxn];

void init()

//加邊,單向圖三個引數,雙向圖四個引數

void addedge(int u, int v, int w, int rw = 0)

//輸入引數:起點、終點、點的總數

//點的編號沒有影響,只要輸入點的總數

int sap(int start, int end, int n)

u = start;

ans += min;

continue;

}bool flag = false;

int v;

for (int i = cur[u]; i != -1; i = edge[i].next)

}if (flag)

int min = n;

for (int i = head[u]; i != -1; i = edge[i].next)

if (edge[i].cap - edge[i].flow && dep[edge[i].to] < min)

gap[dep[u]]--;

if (!gap[dep[u]])return ans;

dep[u] = min + 1;

gap[dep[u]]++;

if (u != start) u = edge[pre[u] ^ 1].to;

}return ans;

}int n, f, d;

char s[300];

int f[300], d[300];

int main()

}for (int i = 1; i <= n; i++)

}int ans = sap(0, f + d + n + n + 1, f + d + n + n + 2);

printf("%d\n",ans);

}return

0;}

HDU 4292Food 最大流 拆點

題意就是每個人都有喜歡的飲料和食物,但是這些飲料和食物有限,問你如何選才能使最多的人喝到自己喜歡的飲料和食物。這題主要就是想清楚如何建邊,然後跑乙個最大流就好了 分別建立 源點指向飲料的邊 飲料指向人的邊 人指向自己的邊 保證每個人只被走一次 人指向食物的邊,食物指向匯點的邊。這裡要把人的點拆成兩個...

HDU4292 FOOD 最大流 拆點

題目大意 有n個人,num1種食物,num2種飲料。每種食物和每種飲料是有限的。每個人有自己喜歡的食物和飲料的種類。問最多有多少人選到自己喜歡的食物和飲料的搭配方案。每個人只能選乙個食物和一杯飲料!這是一道最大流專題裡的題目。拿到題很容易想到這一種建圖方式。超級源點s向每種食物連邊,流量為該種食物的...

成都賽區網路賽 hdu 4292 food

題目 給出n個人喜歡的飲料種類以及食物種類,每個人只能取其中一種且數量為1,現在給出有f中食物以及d種飲料,以及他們各自的數量,問如何安 排食物以及飲料,使得最多的人得到乙個食物以及一瓶飲料 題目類似poj3281 dining 只是那題目每個種類都只有數量1 所以這道題目就只用才起點建邊和終點建邊...