題意:
。。。
思路:
因為food和drink要麼同時要,要不都不要,則需要把它們串起來,牛放中間
對牛進行拆點以限制每頭牛吃了乙份food,和乙份drink
const
int inf = int_max/2;
const
int maxn = 100000;
const
int maxv = 500;
struct edge ;
vector
g[maxv+5];
int level[maxv+5], iter[maxv+5]; // 距離標號,當前邊
// 在殘量網路裡面加邊
void add_edge(int from, int to, int cap) );
g[to].push_back( (edge) );
}// bfs 構建層次
void bfs(int s) }}
}int dfs(int x, int t, int f) }}
return flow;
}int max_flow(int s, int t)
return flow;
}int n, f, d, tot;
// 牛i拆成i, i+n, food-i-i+n-drink
// food i: i+2*n, drink i: i+2*n+f
int main()
rep(j, 1, y)
}// 每頭牛自身拆點
rep(i, 1, n)
// 超級源點0
rep(i, 1, f) add_edge(0, i+2*n, 1);
// 超級匯點tot+1
rep(i, 1, d) add_edge(i+2*n+f, tot+1, 1);
int _max = max_flow(0, tot+1);
cout
<< _max << endl;
return
0;}
poj3281 dining 經典最大流建模方法
題意 有f中食物和d種飲料,每頭牛只能享用一種食物和飲料,每個食物跟飲料也只能被一頭牛享用。現在有n頭牛,每頭牛都有自己喜歡的食物種類列表和飲料列表,問最多能使幾頭牛同時享用到自己喜歡的食物和飲料。f,d,n都是一百以內的。思路 就不說一開始的想法了,是最近學習的最大流的建模裡面的新的方法。之前做過...
POJ 3281 Dining 最大流 拆點
解題思路 令st 0為源點,en f 2 n 1為匯點,st向每種食物建流量為1的邊,每種食物向喜歡它的牛 拆點1 建流量為1的邊,眉頭牛的拆點之間建流量為1的邊,每頭牛 拆點2 向它喜歡的飲料建流量為1的邊,每種飲料向en建流量為一的邊。注意,一定要將牛拆點,如果一頭牛只用乙個點然後連線飲料和食物...
Poj 3281 Dining 拆點網路流
題意和思路都和我部落格的這篇文章幾乎一樣 這裡有一組測試資料 include include include using namespace std const int inf 0x6fffffff 權值上限 const int maxpt 450 頂點數上限 const int maxeg 450...