POJ 3436網路流 拆點 簡單處理

2021-09-24 00:27:36 字數 2257 閱讀 3385

寫的第一道網路流。非板題

網路流貌似核心是在於建圖的處理。

poj-3436 :看了題解才做出來。

要求規劃出合法生產線,這種形式基本就和網路流相關了。

具體題意是:有乙個產品,有k個部件,給出n臺機器,每台機器接受一定的半成品,輸出新的半成品。最終成品是全部部件都在的成品。每個機器都有單位時間最大生產量,輸入序列和輸出序列,輸入序列對應位是0表示不能有這個部件,1表示必須有,2表示可有可無。輸出序列對應0表示沒有,1表示有。

怎麼建網路流的圖呢?

首先是兩台機器之間的邊權不能是最大生產量,因為這樣子是沒辦法限制中間節點的產量的。

考慮一種x

xx形圖,左上左下右上右下都有機器,中間也有乙個機器。如果上面兩條邊總和等於下面兩條邊,也就是對於中間點來說,他自身的容量就沒有意義了。

所以一台機器我們拆成輸入和輸出兩個點,兩點容量即是該機器的容量。

這樣子同時也方便機器間建圖,機器也是從輸出到輸入的。

但是我們還需要開始和結束,超級源點和超級匯點,這兩個點分別連線沒有1的輸入的機器和輸出全部是1的機器,當然後者是機器來連線匯點。

接下來判斷所有邊,非同一機器和超級源點和超級匯點的邊且流量大於0的都是有效邊,記錄輸出即可。

建邊的時候還需要注意除了同一機器邊是容量,其他邊容量應該取無窮大。

#include

#define for(i,a,b) for(int i=a;i<=b;i++)

using

namespace std;

#define ll long long

#define inf 0x3f3f3f3f

const

int maxn =

1010

;struct edge

;int a[

1001000

],b[

1001000

];ll c[

1001000];

struct dinic

void

addedge

(int from,

int to,ll cap));

edges.

push_back

((edge));

tmp=edges.

size()

; g[from]

.push_back

(tmp-2)

; g[to]

.push_back

(tmp-1)

;}bool

bfs(

)//只考慮殘量網路中的弧}}

return vis[t]

;//用於判斷是否能走到底。

}int

dfs(

int x,ll a)

}return flow;

} ll maxflow()

return flow;

}void

pri_ans()

}}printf

(" %d\n"

,cnt)

;for

(int i=

1;i<=cnt;i++

)printf

("%d %d %lld\n"

,a[i]

,b[i]

,c[i]);

}}dc;

vector<

int>gi[maxn]

,go[maxn]

;int

main()

for(j,

1,p)

}for

(i,1

,n)if

(gi[j]

[k]==0)

}if(ok)dc.

addedge

(i+n,j,inf);}

}for

(i,1

,n)if

(ok)dc.

addedge(2

*n+1

,i,inf)

; ok=1;

for(j,

0,p-1)

if(ok)dc.

addedge

(i+n,

2*n+

2,inf);}

dc.pri_ans()

;}}

poj 3436 網路流基礎題

題目鏈結 題意 題意確實難讀。首先給出p,n 兩個數 表示有p臺工具機來組裝電腦,每台電腦有n個零件需要組裝 接著p行,每行描述一台工具機 共2 n 1個數字,第乙個數字表示每單位時間該工具機能處理多少未完成品 接下來n個數字表示該工具機能接受的未完成品型別 0表示該零件不能存在 1表示該零件必須存...

poj3436(拆點最大流)

題意 給你p和n,p代表每台計算器需要幾個部分組成,n代表有幾個組裝機器,接下來n行,每行第乙個數代表這台機器能夠每小時組裝幾台,剩下前三個數字表示使用這台機器需要的前置條件 0代表當前組裝不能有這個部分,1代表得有,2代表無所謂 剩下三個數字表示使用這台機器後的組裝有那幾個部分,問你最多能組裝多少...

POJ 3436 網路流 最大流 輸出路徑

這裡的輸出路徑不太理解 include include include include include include include includeusing namespace std const int maxn 110 const int inf 0x3f3f3f3f int p1,n,m ...