/*題意:每乙個人都有喜歡的吃的和喝的,每乙個人只選擇乙個數量的吃的和乙個數量的喝的,問能滿足最多的人數!?
思路:建圖很是重要!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!如果還...