poj 1459
一道简单的网络流;
这是一道多源多汇的模型;
解决的这样的模型的一个方法是:建立一个超级源和一个超级汇,然后就成为了一个模板题了!
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<cstring> #include<queue> #define inf 9999999999 #define maxn 105 using namespace std; int map[maxn][maxn],level[maxn],m,n; bool bfs() { queue<int>q; memset(level,0,sizeof level); q.push(0); level[0]=1; while(!q.empty()) { int now=q.front(); q.pop(); for(int i=0;i<=m+1;i++) { if(!level[i]&&map[now][i]>0) { level[i]=level[now]+1; q.push(i); } } } return level[m+1]!=0; } int dfs(int s,int cp) { int tmp=cp,t; if(s==m+1) return cp; for(int i=0;i<=(m+1)&&tmp;i++) { if(level[i]==level[s]+1&&map[s][i]>0) { t=dfs(i,min(tmp,map[s][i])); map[s][i]-=t; map[i][s]+=t; tmp-=t; } } return cp-tmp; } int main() { int ns,nc,a,b,c; char s[20]; while(scanf("%d%d%d%d",&m,&ns,&nc,&n)!=EOF) { memset(map,0,sizeof map); for(int i=0;i<n;i++) { scanf("%s",&s); sscanf(s,"(%d,%d)%d",&a,&b,&c); a++,b++; map[a][b]+=c; } for(int i=0;i<ns;i++) { scanf("%s",&s); sscanf(s,"(%d)%d",&a,&b); a++; map[0][a]=b; } for(int i=0;i<nc;i++) { scanf("%s",&s); sscanf(s,"(%d)%d",&a,&b); a++; map[a][m+1]=b; } int ans=0,f; while(bfs()) { while(f=dfs(0,inf)) ans+=f; } printf("%d\n",ans); } return 0; }