之前自己写的,以后当一个模板的基础吧,不管是最大流,最小割,二分图匹配
下面是POJ1273的一个裸题..
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 #include <queue> 6 using namespace std; 7 struct node{ 8 int to,cap,rev; 9 node(int _to,int _cap,int _rev):to(_to),cap(_cap),rev(_rev){} 10 }; 11 const int maxn=1005; 12 vector<node> G[maxn]; 13 int s,t; 14 void add(int u,int v,int cap){ 15 G[u].push_back(node(v,cap,G[v].size())); 16 G[v].push_back(node(u,0,G[u].size()-1)); 17 } 18 bool vis[maxn];//这个可以不要,level数组可以起两个作用,记录层数和是否被访问过,类似于dp数组 19 int level[maxn],iter[maxn]; 20 void bfs(){ 21 memset(level,-1,sizeof(level)); 22 queue<int> q; 23 q.push(s);int i;level[s]=0; 24 while(!q.empty()){ 25 int u=q.front(); 26 q.pop(); 27 for(i=0;i<G[u].size();++i){ 28 node& e=G[u][i]; 29 if(e.cap>0&&level[e.to]<0){ 30 level[e.to]=level[u]+1; 31 q.push(e.to); 32 } 33 } 34 } 35 //需要得到所有顶点的level信息,一方面起vis的作用,另一方面起到转移的作用 36 //而且考虑到可能同时存在多个最短增广路 37 } 38 int dfs(int v,int t,int f){ 39 //printf("v:%d t:%d f:%d ",v,t,f); 40 if(v==t) return f; 41 for(int &i=iter[v];i<G[v].size();++i){ 42 node &e=G[v][i]; 43 if(e.cap>0&&level[e.to]>level[v]){ 44 int d=dfs(e.to,t,min(e.cap,f)); 45 if(d>0){ 46 e.cap-=d; 47 G[e.to][e.rev].cap+=d; 48 return d; 49 } 50 } 51 } 52 return 0;//这里忘记return 0了... 53 } 54 const int INF=~0u>>1; 55 int maxflow(){ 56 int flow=0,f; 57 for(;;){ 58 bfs(); 59 if(level[t]<0) return flow; 60 memset(iter,0,sizeof(iter)); 61 while((f=dfs(s,t,INF))>0) flow+=f; 62 } 63 } 64 //直觉上 容量种数越少越快 65 int main(){ 66 //freopen("testMaxFlow.txt","r",stdin); 67 int n,i,u,v,cap,m; 68 while(~scanf("%d%d",&m,&n)){ 69 s=1;t=n; 70 for(int i=1;i<=n;++i) G[i].clear();//多组数据要清空边 71 for(i=0;i<m;++i){ 72 scanf("%d%d%d",&u,&v,&cap); 73 add(u,v,cap); 74 } 75 printf("%d ",maxflow()); 76 } 77 return 0; 78 }