題意:分配問題,有f種食物,d種飲料,n頭牛,每頭牛有自己喜歡的吃的和喝的東西,現在讓你去分配,使得吃喝都得到的牛最多。每種吃喝的東西只能招待一頭牛。
分析:把一頭牛拆成兩頭,一頭和食物連,一頭和飲料連,當然這兩頭牛之間肯定要連一條邊,新增乙個源點匯點分別向食物和飲料連。這裡把牛拆成兩個點是為了限制進過牛的流最大為1,這樣就可以通過求最大流來得到答案。
舉例說明為什麼要拆牛:(見discuss)
比如只有1條牛,1 2 兩種食物,1 2兩種水
那圖會是下邊那樣的
食物1 食物2
| |
| |
-----> 牛
/ \/ \
水1 水2
對應的輸入資料是
1 2 2
2 2 1 2 1 2
這時候答案為2了wa了,因為沒有拆點,所以導致一頭牛享受了兩套美餐,這怎麼可以呢
而拆成下邊那樣就對了
食物1 食物2
| |
| |
--> 牛1
\|-->還是牛1
/ \/ \
水1 水2
至於要拆牛,而不是拆食物的原因:因為一頭牛只能選一種食物和飲料,把牛拆了,中間的容量為1.這樣可以保證它只選一種。如果不拆牛的話不能保證。
剛學習了ek演算法,這個題用的是鄰接矩陣的ek演算法。
**:view code
1 #include 2 #include 3 #include 4 #include 5tjuoj 2823using
namespace
std;
6const
int maxdata=(1
<<30); //
!!!7
const
int maxnum=405;8
intf[maxnum][maxnum];
9int
pre[maxnum];
10int
cf[maxnum];
11int
food,d,n;
12 queueq;
1314
void
init()
1537
for(j=1;j<=dnum;j++)
3842}43
}4445int bfs(int s,int
e)4669}
70}71if(pre[e]==-1)72
return -1;73
return
cf[e];74}
7576
int maxflow(int s,int
e)77
94 sum+=ans;95}
96return
sum;97}
9899
intmain()
100105
106/*
1074 3 3
1082 2 1 2 1 3
1092 2 2 3 1 2
1102 2 1 3 1 2
1112 1 1 3 3
112*/
poj3281網路流之最大流
加乙個源點和匯點,把每頭牛拆成兩個點,不拆點的話可能會出現多對食物與飲料被乙個牛享用的情況,拆點後流量為1,不能同時通過了 然後用最大流處理,每個鏈結邊都是1 include include include include include include include include includ...
POJ 1459 網路流,EK演算法
題目大意 網路流當中的多源多匯求最大流 題目解析 生成乙個超級源,指向所有源,並且生成乙個超級匯,使得所有匯都指向超級匯 ac include include include include include includeusing namespace std const int inf 0x3ff...
網路流 EK演算法
ek演算法的思路 基於貪心的思想,每次選取一條起點到終點的路徑,毋庸置疑,這條路的流量就等於這條路徑上的權值是最小值。將這條路的權值都減去流量,再將路徑的反向邊加上流量 這樣可以就給貪心一次反悔的機會 無限迴圈以上步驟,到找不到任何一條起點到終點的路,最後所有的最小值加起來就是最大流了。這只是我對e...