Dining POJ 3281 (拆點網路流)

2021-09-25 19:45:50 字數 1397 閱讀 5865

題意:

n 頭牛, f 種食物 (食物只有乙份), d 種飲料(飲料只有乙份)

然後每頭牛喜歡哪些食物,哪些飲料。每頭牛只有喝了自己喜歡喝的飲料,吃了自己喜歡吃的食物才會開心

問最多能讓多少頭牛開心。

思路:1)最大流模板,(新增 源點 和 匯點)

2)但是存在問題,每個牛可能會吃多種食物,喝多種飲料,怎麼能這種情況怎麼能出現呢?(影響牛牛社會不平衡)

3)那就限制每頭牛只能吃乙個,怎麼限制呢?

4)加條流量為 1 邊,把每頭奶牛這個點給拆成兩個點,將同一頭牛的兩點連線(流量限制為 1 ),這樣,就能保證每頭牛不會多吃,多喝了。

ac**:

#include#include#include#include#includeusing namespace std;

const int maxn = 700;

const int maxm = 1e5;

const int inf = 0x3f3f3f3f;

int n, f, d;

int s, e;

struct acedge[maxm];

int head[maxn], dis[maxn], curedge[maxn], cnt;

void init()

void addedge(int u, int v, int c) ;

head[u] = cnt++;

// 反向建邊, 流量為0

edge[cnt] = ;

head[v] = cnt++;

}bool bfs()

}return dis[e] > 0; // 判斷是否存在增廣路,s是否能到達e

}int dfs(int u, int flow)

}dis[u] = -1; // // 炸點優化

return 0;

}int dinic()

return sum;

}int main()

for(int j = 1; j <= d; j++)

for (int i = 1; i <= n; ++i)

addedge( i + 100, i + 200, 1);

for (int j = 1; j <= di; ++j)

} cout << dinic() << endl;

} return 0;

}

第一次遇到拆點題,小結下

當對某個東西有限制時(比如對牛,只讓他喝一種飲料,吃一種食物),那如果一頭牛能吃2個食物,2個飲料呢?

這就需要對中途經過的重要點 進行拆點。

又感覺自己學會了???

丟擲個問題。

如果一頭牛需要吃2個食物,喝1個飲料才會開心,那怎麼解決呢?

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

Poj 3281 Dining 拆點網路流

題意和思路都和我部落格的這篇文章幾乎一樣 這裡有一組測試資料 include include include using namespace std const int inf 0x6fffffff 權值上限 const int maxpt 450 頂點數上限 const int maxeg 450...