加乙個源點和匯點,把每頭牛拆成兩個點,不拆點的話可能會出現多對食物與飲料被乙個牛享用的情況,拆點後流量為1,不能同時通過了
然後用最大流處理,每個鏈結邊都是1
#include#includeview code#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define pi acos(-1)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/stack:1024000000,1024000000")
using
namespace
std;
const
double g=10.0,eps=1e-9
;const
int n=400+5,maxn=16,inf=999999
;int
c[n][n],pre[n];
bool
vis[n];
ints,t,n,food,drink;
bool
bfs()}}
return0;
}int
max_flow()
ans+=minn;
}}int
main()
while(b--)
}s=0,t=n+n+food+drink+1
;
for(int i=1;i<=n;i++)c[food+i][food+n+i]=1
;
for(int i=1;i<=food;i++)//
源點為0,匯點為n+food+drink+1
c[0][i]=1
;
for(int i=1;i<=drink;i++)
c[n+n+food+i][n+n+food+drink+1]=1
; cout
return0;
}
poj3281 網路流 EK演算法
題意 分配問題,有f種食物,d種飲料,n頭牛,每頭牛有自己喜歡的吃的和喝的東西,現在讓你去分配,使得吃喝都得到的牛最多。每種吃喝的東西只能招待一頭牛。分析 把一頭牛拆成兩頭,一頭和食物連,一頭和飲料連,當然這兩頭牛之間肯定要連一條邊,新增乙個源點匯點分別向食物和飲料連。這裡把牛拆成兩個點是為了限制進...
POJ 3281(最大流,拆點)
2014 12 20 18 05 00 思路 嘛,這題終於不是max flow果題了。因為種種限制,需要將牛進行拆點,從而限制每頭牛只能選擇一種dish和一種drink,每頭牛拆為兩點,點間建邊,容量為1。我本來是將dish拆點的,怎麼想都覺得對,後來發現如果按照牛 dish in dish out...
poj 3281 拆點 最大流
題意 有n頭牛,f種食物,d種飲料,每頭牛有自己喜歡的食物和飲料,問你最多能夠幾頭牛搭配好,每種食物或者飲料只能一頭牛享用 解題思路 把牛拆點,因為流過牛的流量是由限制的,只能為1,然後,食物和牛的入點相連,牛的出點和飲料相連,求解最大流 include include include includ...