最大流(代码以及博客云集版)
codes:
解决最大流问题参考代码1:
1 #include <bits/stdc++.h> 2 #define MAX 1100 3 #define INF 0x3f3f3f3f 4 using namespace std; 5 struct Node{ 6 int to;//终点 7 int cap;//容量 8 int rev;//反向边 9 }; 10 11 vector<Node> v[MAX]; 12 bool visited[MAX]; 13 14 void Add_Node(int from, int to, int cap) 15 { 16 v[from].push_back((Node){to,cap,v[to].size()}); 17 v[to].push_back((Node){from,0,v[from].size()-1}); 18 } 19 20 int DFS(int s, int t,int f) 21 { 22 if(s==t) 23 return f; 24 visited[s]=true; 25 for(int i=0;i<v[s].size();i++) 26 { 27 Node &temp=v[s][i]; 28 if(visited[temp.to]==false &&temp.cap>0) 29 { 30 int d=DFS(temp.to,t,min(f,temp.cap)); 31 if(d>0) 32 { 33 temp.cap-=d; 34 v[temp.to][temp.rev].cap+=d; 35 return d; 36 } 37 } 38 } 39 return 0; 40 } 41 42 int Max_Flow(int s,int t) 43 { 44 int flow=0; 45 for(;;) 46 { 47 memset(visited,false,sizeof(visited)); 48 int f=DFS(s,t,INF); 49 if(f==0) 50 return flow; 51 flow+=f; 52 } 53 } 54 int main() 55 { 56 int n,s,t; 57 int start,over,capacity; 58 while(~scanf("%d%d%d",&n,&s,&t)) 59 { 60 memset(v,0,sizeof(v)); 61 for(int i=0;i<n;i++) 62 { 63 scanf("%d%d%d",&start,&over,&capacity); 64 Add_Node(start,over,capacity); 65 } 66 printf("%d\n",Max_Flow(s,t)); 67 } 68 }
解决最大流问题参考代码2:
1 #include <iostream> 2 #include <queue> 3 #include<string.h> 4 using namespace std; 5 #define arraysize 201 6 int maxData = 0x7fffffff; 7 int capacity[arraysize][arraysize]; //记录残留网络的容量 8 int flow[arraysize]; //标记从源点到当前节点实际还剩多少流量可用 9 int pre[arraysize]; //标记在这条路径上当前节点的前驱,同时标记该节点是否在队列中 10 int n,m; 11 queue<int> myqueue; 12 int BFS(int src,int des) 13 { 14 int i,j; 15 while(!myqueue.empty()) //队列清空 16 myqueue.pop(); 17 for(i=1;i<=m;++i) 18 { 19 pre[i]=-1; 20 } 21 pre[src]=0; 22 flow[src]= maxData;//初始化为最大值 23 myqueue.push(src); 24 while(!myqueue.empty()) 25 { 26 int index = myqueue.front(); 27 myqueue.pop(); 28 if(index == des) //找到了增广路径 29 break; 30 for(i=1;i<=m;++i) 31 { 32 if(i!=src && capacity[index][i]>0 && pre[i]==-1) 33 { 34 pre[i] = index; //记录前驱!!!对应的是后继 35 flow[i] = min(capacity[index][i],flow[index]); //关键:迭代的找到增量(change) 36 myqueue.push(i);//push进队列 37 } 38 } 39 } 40 if(pre[des]==-1) //残留图中不再存在增广路径 41 return -1; 42 else 43 return flow[des]; 44 } 45 int maxFlow(int src,int des) 46 { 47 int increasement= 0; 48 int sumflow = 0; 49 while((increasement=BFS(src,des))!=-1) 50 { 51 int k = des; //利用前驱寻找路径 52 while(k!=src) 53 { 54 int last = pre[k]; 55 capacity[last][k] -= increasement; //改变正向边的容量 56 capacity[k][last] += increasement; //改变反向边的容量 57 k = last; 58 } 59 sumflow += increasement; 60 } 61 return sumflow; 62 } 63 int main() 64 { 65 int i,j; 66 int start,end,ci; 67 while(cin>>n>>m) 68 { 69 memset(capacity,0,sizeof(capacity)); 70 memset(flow,0,sizeof(flow)); 71 for(i=0;i<n;++i) 72 { 73 cin>>start>>end>>ci; 74 if(start == end) //考虑起点终点相同的情况 75 continue; 76 capacity[start][end] +=ci; //此处注意可能出现多条同一起点终点的情况 77 } 78 cout<<maxFlow(0,m)<<endl; 79 } 80 return 0; 81 }
Blogs:
基础知识博客:http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html
模板博客提供:http://blog.csdn.net/y990041769/article/details/21026445
详解博客(推荐):http://www.cnblogs.com/zsboy/archive/2013/01/27/2878810.html
详解博客(推荐):http://www.cnblogs.com/kuangbin/archive/2011/07/26/2117636.html
各种算法汇集博客:http://www.cnblogs.com/longdouhzt/archive/2012/05/20/2510753.html
作者: 伊甸一点
出处: http://www.cnblogs.com/zpfbuaa/
本文版权归作者伊甸一点所有,欢迎转载和商用(须保留此段声明),且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文链接 如有问题, 可邮件(zpflyfe@163.com)咨询.