模板:
最大流:
普通增广:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #define maxn 1010 8 #define INF 0x3f3f3f3f 9 using namespace std;10 struct edge{11 int to,cap,rev;12 };13 vector G[maxn];14 bool used[maxn];15 void addedge(int from,int to,int cap){16 G[from].push_back((edge){to,cap,G[to].size()});17 G[to].push_back((edge){ from,0,G[from].size()-1});18 }19 int dfs(int v,int t,int f){20 if (v==t)return f;21 used[v]=true;22 for (int i=0;i 0){25 int d = dfs(e.to,t,min(f,e.cap));26 if (d>0){27 e.cap-=d;28 G[e.to][e.rev].cap +=d;29 return d;30 }31 }32 }33 return 0;34 }35 int max_flow(int s,int t){36 int flow = 0;37 while(1){38 memset(used,0,sizeof(used));39 int f = dfs(s,t,INF);40 if(f==0)return flow;41 flow+=f;42 }43 }44 int main (){45 46 47 }
Dinic:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include
SAP:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include
最小费用流:
bellman-ford:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #define maxn 1010 8 #define maxm 1010 9 #define INF 0x3f3f3f3f10 using namespace std;11 struct edge{ int to,cap,cost,rev;};12 int V; //顶点数13 vector G[maxn];//邻接表14 int dist[maxn];//最短距离15 int prevv[maxn],preve[maxn];//最短路中前驱节点以及对应的边16 void addedge(int from ,int to, int cap, int cost){17 G[from].push_back((edge){to,cap,cost,G[to].size()});18 G[to].push_back((edge){ from,0,-cost,G[from].size()-1});19 }20 21 //求从s到t的流量为f的最小费用流,22 //如果无法增广返回-123 //复杂度:O(F|V||E|)24 int min_cost_flow(int s, int t,int f){25 int res = 0;26 while(f>0){27 //利用bellman-ford求解最短路28 fill (dist,dist+V,INF);29 dist[s]=0;30 bool update = true;31 while(update){32 update = false;33 for(int v = 0; v 0&&dist[e.to]>dist[v]+e.cost){38 dist[e.to]=dist[v]+e.cost;39 prevv[e.to]=v;40 preve[e.to]=i;41 update = true;42 }43 }44 }45 }46 if (dist[t]==INF){47 //无法再增广48 return -1;49 }50 51 //沿着最短路尽量增广52 int d = f;53 for(int v = t; v!=s;v = prevv[v]){54 d = min(d,G[prevv[v]][preve[v]].cap);55 }56 f-=d;57 res+=d*dist[t];58 for(int v = t;v!=s;v = prevv[v]){59 edge &e = G[prevv[v]][preve[v]];60 e.cap -=d;61 G[v][e.rev].cap+=d;62 }63 }64 return res;65 }66 int main (){67 int n,m;68 while(scanf("%d%d",&n,&m)!=EOF){69 V=n+1;70 for(int i=0;i
Dijkstra:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #define maxn 1010 8 #define maxm 1010 9 #define INF 0x3f3f3f3f10 using namespace std;11 typedef pair P;//first 为最短距离,second为顶点编号12 struct edge{ int to,cap,cost,rev; };13 int V; //顶点数14 vector G[maxn];//邻接表15 int dist[maxn];//最短距离16 int h[maxn];//顶点的势17 int prevv[maxn],preve[maxn];//最短路中前驱节点以及对应的边18 void addedge(int from ,int to, int cap, int cost){19 G[from].push_back((edge){to,cap,cost,G[to].size()});20 G[to].push_back((edge){ from,0,-cost,G[from].size()-1});21 }22 23 //求从s到t的流量为f的最小费用流,24 //如果无法增广返回-125 //复杂度:O(F|V||E|)26 int min_cost_flow(int s, int t,int f){27 int res = 0;28 fill(h,h+V,0);29 while(f>0){30 //利用Dijkstra更新h31 priority_queue ,greater >q;32 fill (dist,dist+V,INF);33 dist[s]=0;34 q.push(P(0,s));35 while(!q.empty()){36 P p = q.top();37 q.pop();38 int v = p.second;39 if (dist[v]
0&&dist[e.to]>dist[v]+e.cost+h[v]-h[e.to]){43 dist[e.to]=dist[v]+e.cost+h[v]-h[e.to];44 prevv[e.to]=v;45 preve[e.to]=i;46 q.push(P(dist[e.to],e.to));47 }48 }49 }50 if (dist[t]==INF){51 //无法再增广52 return -1;53 }54 for (int v=0;v