hdu4292Food(最大流Dinic演算法)

2021-09-08 17:19:14 字數 1335 閱讀 3283

/*

題意:每乙個人都有喜歡的吃的和喝的,每乙個人只選擇乙個數量的吃的和乙個數量的喝的,問能滿足最多的人數!?

思路:建圖很是重要!f-food, p-people, d-drink

建圖: 0(源點)--->f--->p---->p'---->d--->t(匯點)

將人拆分很是重要,因為每乙個人最多只能有一種選擇,也就是p--->p'的最大流量是 1!

如果還是不清楚,看一看下圖的例子,將人拆分與不拆分的區別!

*/1 #include2 #include3 #include4 #include5 #include6 #include7

#define n 850

8#define m 201000

9#define inf 0x3f3f3f3f

10using

namespace

std;

1112

struct

edge;

1516

intfirst[n];

17edge g[m];

18int

cnt;

19int

n, f, d;

2021

void addedge(int u, int v, int

cap)

3233

intans, ss;

3435 queueq;

36int

dist[n];

3738

bool

bfs()

52} 53}

54if(dist[ss+1]==0) return

false;55

return

true;56

}5758int dfs(int u, int

flow)69}

70 dist[u]=-1;//

表示u節點不能到達匯點!

71return0;

72}7374

void

dinic()

8182

intmain()

9293

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

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

106}

107108

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

117}

118119

dinic();

120 printf("

%d\n

", ans);

121}

122return0;

123 }

HDU 4292Food 最大流 拆點

題意就是每個人都有喜歡的飲料和食物,但是這些飲料和食物有限,問你如何選才能使最多的人喝到自己喜歡的飲料和食物。這題主要就是想清楚如何建邊,然後跑乙個最大流就好了 分別建立 源點指向飲料的邊 飲料指向人的邊 人指向自己的邊 保證每個人只被走一次 人指向食物的邊,食物指向匯點的邊。這裡要把人的點拆成兩個...

HDU4292 FOOD 最大流 拆點

題目大意 有n個人,num1種食物,num2種飲料。每種食物和每種飲料是有限的。每個人有自己喜歡的食物和飲料的種類。問最多有多少人選到自己喜歡的食物和飲料的搭配方案。每個人只能選乙個食物和一杯飲料!這是一道最大流專題裡的題目。拿到題很容易想到這一種建圖方式。超級源點s向每種食物連邊,流量為該種食物的...

hdu4292Food(最大流Dinic演算法)

題意 每乙個人都有喜歡的吃的和喝的,每乙個人只選擇乙個數量的吃的和乙個數量的喝的,問能滿足最多的人數!思路 建圖很是重要!f food,p people,d drink 建圖 0 源點 f p p d t 匯點 將人拆分很是重要,因為每乙個人最多只能有一種選擇,也就是p p 的最大流量是 1!如果還...