這道題好長..看了好久才看懂..囧..也就是說每個machine對於電腦半成品所包含零件的輸入有三種要求..0代表不能有該零件輸入..1代表必須有該零件輸入..2代表有或沒有無所謂...而每個machine產生的電腦半成品中每個零件有兩種狀態..0代表半成品包含該零件,1代表半成品不包含該零件..題目中最開始是給一堆沒有任何零件的半成品..最終需要的是所有零件都包含的成品..問最多能得到多少成品電腦..
建立乙個超級源點,其所有的s為0,q為無窮大..建立乙個超級匯點,其所有的d為1,q為無窮大...將所有的點拆成匯點和出點,匯點到出點的流量為其q..乙個machine的結果滿足另乙個machine的輸入的建立有向線段...在這個過程中超級源點和超級匯點都參與..
從超級源點到超級匯點跑最大流..最大流的結果就是輸出的最多成品電腦數..
而要得出用了哪些路徑,每條路徑流過的流量.那麼就判斷輸入時的那些個個machine間的有向線段剩餘容量的變化..
program:
#include#include#include#include#include#define oo 2000000000
using namespace std;
struct node1
machine[55];
struct node2
line[20005];
int n,p,m,_link[205],ans,num,way[505],dis[205];
bool inqueue[205];
queuemyqueue;
bool bfs()
k=line[k].next;}}
return dis[n];
}bool dfs(int p,int flow)
return true;
}num++;
k=_link[p];
while (k)
k=line[k].next;
}num--;
return false;
}void maxflow()
return;
}int main()
n++;
machine[0].q=machine[n].q=oo;
for (j=1;j<=p;j++) machine[n].s[j]=1;
m=0;
for (i=1;i<=n;i++)
for (i=0;i
poj3436(拆點最大流)
題意 給你p和n,p代表每台計算器需要幾個部分組成,n代表有幾個組裝機器,接下來n行,每行第乙個數代表這台機器能夠每小時組裝幾台,剩下前三個數字表示使用這台機器需要的前置條件 0代表當前組裝不能有這個部分,1代表得有,2代表無所謂 剩下三個數字表示使用這台機器後的組裝有那幾個部分,問你最多能組裝多少...
POJ 3436網路流 拆點 簡單處理
寫的第一道網路流。非板題。網路流貌似核心是在於建圖的處理。poj 3436 看了題解才做出來。要求規劃出合法生產線,這種形式基本就和網路流相關了。具體題意是 有乙個產品,有k個部件,給出n臺機器,每台機器接受一定的半成品,輸出新的半成品。最終成品是全部部件都在的成品。每個機器都有單位時間最大生產量,...
POJ 3436 網路流 最大流 輸出路徑
這裡的輸出路徑不太理解 include include include include include include include includeusing namespace std const int maxn 110 const int inf 0x3f3f3f3f int p1,n,m ...