最大流
1 struct edge{ 2 int v,w; 3 edge*next,*r; 4 }e[maxm],*fir[maxn],*cur[maxn],*pt=e; 5 void add(int u,int v,int w){ 6 pt->v=v;pt->w=w; 7 pt->next=fir[u]; 8 fir[u]=pt++; 9 } 10 void addedge(int u,int v,int w){ 11 add(u,v,w);add(v,u,0); 12 fir[u]->r=fir[v];fir[v]->r=fir[u]; 13 } 14 bool bfs(){ 15 queue<int>Q;Q.push(S); 16 clr(d,0);d[S]=1; 17 while(!Q.empty()){ 18 int x=Q.front();Q.pop(); 19 for(edge*e=fir[x];e;e=e->next){ 20 if(e->w&&!d[e->v]){ 21 d[e->v]=d[x]+1;Q.push(e->v); 22 } 23 } 24 } 25 return d[T]; 26 } 27 int dfs(int x,int w){ 28 if(x==T||!w) return w; 29 int f=0; 30 for(edge*&e=cur[x];e;e=e->next){ 31 if(e->w&&d[e->v]==d[x]+1){ 32 int g=dfs(e->v,min(e->w,w)); 33 if(g>0){ 34 f+=g; 35 e->w-=g; 36 e->r->w+=g; 37 if(!(w-=g)) break; 38 } 39 } 40 } 41 return f; 42 }
最小费用最大流
待补。。