昨天写最大获利 的时候惊奇的发现我的dinic模板竟然挂了。。。
现在刚刚调对。。。。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<vector> #include<queue> #define MAX 600100 #define inf 0x7fffffff using namespace std; int n,m; struct dinic { struct Edge { int from,to,cap,filp; }; vector<int>g[MAX]; vector<Edge>edge; void add_edge(int From,int To,int Cap,int Cap_) { edge.push_back((Edge){From,To,Cap,0}); edge.push_back((Edge){To,From,Cap_,0}); int mm=edge.size(); g[From].push_back(mm-2); g[To].push_back(mm-1); } int s,t; int cur[MAX]; int dis[MAX]; int done[MAX]; bool bfs() { memset(done,0,sizeof(done)); queue<int> q; q.push(s); done[s]=1; dis[s]=0; while(!q.empty()) { int now=q.front(); q.pop(); for(int w=0;w<g[now].size();w++) { Edge &e=edge[g[now][w]]; if(done[e.to]==0&&e.cap>e.filp) { done[e.to]=1; dis[e.to]=dis[now]+1; q.push(e.to); } } } return done[t]; } int dfs(int x,int a) { if(x==t||a==0) return a; int flow=0,f; for(int &w=cur[x];w<g[x].size();w++) { Edge &e=edge[g[x][w]]; if(dis[e.to]==dis[x]+1&&(f=dfs(e.to,min(a,e.cap-e.filp)))>0) { e.filp+=f; edge[g[x][w]^1].filp-=f; flow+=f; a-=f; if(!a) break; } } return flow; } int maxfile(int S,int T) { this->s=S; this->t=T; int answer=0; while(bfs()) { memset(cur,0,sizeof(cur)); answer+=dfs(s,inf); } return answer; } }solve; int main() { scanf("%d%d",&n,&m); int s,t; s=0; t=n*2+1; for(int i=1;i<=n;i++) { int a1,a2; scanf("%d%d",&a1,&a2); solve.add_edge(s,i,a1,0); solve.add_edge(i,t,a2,0); } for(int i=1;i<=m;i++) { int a1,a2,a3; scanf("%d%d%d",&a1,&a2,&a3); solve.add_edge(a1,a2,a3,a3); } int answer=solve.maxfile(s,t); printf("%d\n",answer); return 0; }
poj3469 DINIC模板,布布扣,bubuko.com
原文:http://blog.csdn.net/wbysr/article/details/21063095