2014-12-20 18:05:00
思路:嘛,這題終於不是max-flow果題了。
因為種種限制,需要將牛進行拆點,從而限制每頭牛只能選擇一種dish和一種drink,每頭牛拆為兩點,點間建邊,容量為1。
(我本來是將dish拆點的,怎麼想都覺得對,後來發現如果按照牛 -> dish_in -> dish_out -> drink這樣建圖的話,為使得dish_out和drink之間的邊不具有牛的編號性,即各條邊不知道是哪個牛的選擇,可能有些牛不喜歡某種搭配,但因為其他牛喜歡這種搭配而強行被當成一條通路了,自然就wa了)
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include8 #include 9 #include 10 #include 11 #include 12
using
namespace
std;
13#define lp (p << 1)
14#define rp (p << 1|1)
15#define getmid(l,r) (l + (r - l) / 2)
16#define mp(a,b) make_pair(a,b)
17 typedef long
long
ll;18 typedef unsigned long
long
ull;
19const
int inf = 1
<< 30;20
const
int maxn = 1000;21
22int
n,f,d;
23int
cp[maxn][maxn],ed,lev[maxn];
24int
q[maxn],head,rear;
2526
void
bfs()36}
37}3839
int dfs(int p,int
minf)48}
49return0;
50}5152
intdinic()
59return
max_flow;60}
6162
intmain()
76for(int j = 1; j <= b; ++j)80}
81 printf("
%d\n
",dinic());
82return0;
83 }
poj 3281 拆點 最大流
題意 有n頭牛,f種食物,d種飲料,每頭牛有自己喜歡的食物和飲料,問你最多能夠幾頭牛搭配好,每種食物或者飲料只能一頭牛享用 解題思路 把牛拆點,因為流過牛的流量是由限制的,只能為1,然後,食物和牛的入點相連,牛的出點和飲料相連,求解最大流 include include include includ...
POJ 3281 Dining 最大流 拆點
解題思路 令st 0為源點,en f 2 n 1為匯點,st向每種食物建流量為1的邊,每種食物向喜歡它的牛 拆點1 建流量為1的邊,眉頭牛的拆點之間建流量為1的邊,每頭牛 拆點2 向它喜歡的飲料建流量為1的邊,每種飲料向en建流量為一的邊。注意,一定要將牛拆點,如果一頭牛只用乙個點然後連線飲料和食物...
poj 3281 Dining(最大流基礎,拆點)
題意 思路 因為food和drink要麼同時要,要不都不要,則需要把它們串起來,牛放中間 對牛進行拆點以限制每頭牛吃了乙份food,和乙份drink const int inf int max 2 const int maxn 100000 const int maxv 500 struct edg...