放两个模版

最大流

 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 }
View Code

最小费用最大流

待补。。

 

posted @ 2015-08-30 18:23  ChenThree  阅读(121)  评论(0编辑  收藏  举报