網路流拆點法和分配結點和超級源點匯點的應用

2021-10-11 16:15:47 字數 1076 閱讀 4859

有f種食物和d種飲料,每種食物或飲料只能供一頭牛享用,且每頭牛只享用一種食物和一種飲料。現在有n頭牛,每頭牛都有自己喜歡的食物種類列表和飲料種類列表,問最多能使幾頭牛同時享用到自己喜歡的食物和飲料。(1 <= f <= 100, 1 <= d <= 100, 1 <= n <= 100)

一種顯然的想法是所有食物連源點,所有飲料連線匯點,然後讓牛為中間結點,跑一次最大流. 但是這樣會出現乙個牛用了多個食物和飲料的情況。

這種情況下我們把牛拆成兩部分(i,n+i)i部分與食物連線,n+i部分與飲料連線,然後兩部分自己連線(流量為1)。這樣跑出來的網路流,保證了每個牛只有一種分配方案.注意體會飲料,食物,牛之間的編號方法.還有源點匯點的編號.

因為要保證各個點之間不會出現重複的現象,現規定0-n-1是第一部分牛的編號. n-2n-1部分是第二部分牛. 2*n-2*n+f是食物部分 2*n+f-2*n+f+d是飲料部分,不放心的中間自己加點常數啥的

最後源點s=2*n+f+d 匯點t=s+1;

**部分:

#include#include#include#include#include#include#define maxn 500

#define inf 10000000

using namespace std;

struct edge;

struct dinic

}} return vis[t];

} int dfs(int x,int a)

} return flow;

} int max_flow(int s,int t) return flow;

}};int lf[105][105],ld[105][105];

int main()

while(drink--)

} //foodnumber=2*n+i drinknumber=2*n+f+i

int s=2*n+f+d+20; int t=s+1;

for(i=0;ifor(i=0;ifor(i=0;ifor(j=0;j}printf("%d\n",dd.max_flow(s,t));

return 0;}

網路流講解和基本實現

最大網路流的問題可以有如下的概括 首先地圖上有n個節點,有m條有向邊 有這麼乙個節點,入度為0,定義為源節點,一般定義為1節點 有這麼乙個節點,出度為0,定義為匯節點,一般定義為n節點 所有的m條邊都有兩個屬性,容量和流量,流量 容量,沒有距離這個屬性 對於除了1號n號節點,所有節點的進入流量等同於...

網路流基本概念和定義

問題 rightarrow 某種方式建圖的網路流 rightarrow 網路流解與原問題解是否等價。流網路是乙個有向圖 g 其中有兩個特殊點 s,t in v 分別為源點和匯點。g 中每一條邊有乙個 ge 0 的權值,稱作邊的容量,邊 u,v 容量可記做 c u,v 源點相當於乙個水源,匯點相當於乙...

網路最大流和最小費用流

from 網路最大流和最小費用流.html 網路流isap演算法的簡單介紹 from 這幾天由於種種原因經常接觸到網路流的題目,這一型別的題給人的感覺,就是要非常使勁的yy才能出來點比較正常的模型。尤其是看了amber最小割應用的文章,裡面的題目思路真是充滿了綿綿不絕的yd思想。然而比賽中,當你yd...