//網路流——最大流<br />//通過添加虛源點和虛匯點構圖,轉化為從源點到匯點的最短路<br />#include<iostream><br />#include<cstring><br />#include<queue><br />#define INF 2000000000<br />using namespace std;<br />int n,np,nc,m;<br />int x,y,c,p,f,maxflow,st,ed,u,v;<br />int cap[105][105],flow[105][105];<br />int rflow[105],pre[105];<br />int main()<br />{<br />//freopen("in.txt","r",stdin);<br />while(scanf("%d%d%d%d",&n,&np,&nc,&m) != EOF)<br />{<br />maxflow = 0;<br />memset(cap,0,sizeof(cap));<br />memset(flow,0,sizeof(flow));<br />st = n;<br />ed = n + 1;<br />for(int i = 0;i < m;++i)<br />{<br />scanf("%*[^(](%d,%d)%d",&x,&y,&c);//神奇的輸入方式,參考poj上的discuss才知道的,還可以通過sscanf來實現<br />cap[x][y] = c;<br />}<br />for(int i = 0;i < np;++i)<br />{<br />scanf("%*[^(](%d)%d",&p,&f);<br />cap[st][p] = f;//添加虛源點,將源點和發電站相連<br />}<br />for(int i = 0;i < nc;++i)<br />{<br />scanf("%*[^(](%d)%d",&c,&f);<br />cap[c][ed] = f;//添加虛匯點,將用電器和匯點相連<br />}<br />for(;;)//最大流模板<br />{<br />queue<int> q;<br />memset(rflow,0,sizeof(rflow));<br />rflow[st] = INF;<br />q.push(st);<br />while(!q.empty())<br />{<br />u = q.front();<br />q.pop();<br />for(v = 0;v <= ed;++v)<br />{<br />if(!rflow[v] && cap[u][v] > flow[u][v])//殘留量未被標記並且容量大於當前流量,則可拓展該結點<br />{<br />rflow[v] = min(rflow[u],cap[u][v] - flow[u][v]);//更新最小結點殘量值<br />pre[v] = u;//前驅指標<br />q.push(v);<br />}<br />}<br />}<br />if(rflow[ed] == 0)break;//匯點未被標記,說明殘量網路中找不到增廣路,跳出<br />for(u = ed;u != st;u = pre[u])//從匯點靠前驅指標往回遍曆增廣路<br />{<br />flow[pre[u]][u] += rflow[ed];//更新正向當前流量<br />flow[u][pre[u]] -= rflow[ed];//更新反向當前流量<br />}<br />maxflow += rflow[ed];//更新最大流<br />}<br />printf("%d/n",maxflow);<br />}<br />return 0;<br />}