POJ 3281(最大流,拆點)

2022-05-24 15:45:08 字數 1267 閱讀 7473

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 #include 

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