poj 3281 Dining(最大流基礎,拆點)

2021-06-29 08:57:49 字數 1046 閱讀 7474

題意:

。。。

思路:

因為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...