解法:拆人
**:
#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 所以這道題目就只用才起點建邊和終點建邊...