寫的第一道網路流。非板題。
網路流貌似核心是在於建圖的處理。
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 ...