1 #include<vector> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 #define INF 0x7fffffff 6 #define MAX_V 210 7 8 using namespace std; 9 10 //用于表示边的结构体 11 struct edge 12 { 13 int to; //终点 14 int cap; //容量 15 int rev; //反向边 16 }; 17 18 int m,n; 19 int iter[MAX_V]; //顶点到源咪的距离标号 20 int level[MAX_V]; //当前弧,在其之前的边已经没有用了 21 vector<edge> G[MAX_V]; //图的邻接表表示,多组测试数据时注意初始化(清空) 22 23 //向图中增加一条从from到to的容量为cap的边 24 void add_edge(int _from,int _to,int _cap) 25 { 26 edge temp; 27 temp.to=_to; 28 temp.cap=_cap; 29 temp.rev=G[_to].size(); 30 G[_from].push_back(temp); 31 temp.to=_from; 32 temp.cap=0; 33 temp.rev=G[_from].size()-1; 34 G[_to].push_back(temp); 35 } 36 37 //通过BFS计算从源点出发的距离标号 38 void bfs(int s) 39 { 40 memset(level,-1,sizeof(level)); 41 queue<int> que; 42 level[s]=0; 43 que.push(s); 44 while(!que.empty()) 45 { 46 int v=que.front(); 47 que.pop(); 48 for(int i=0;i<G[v].size();i++) 49 { 50 edge &e=G[v][i]; 51 if(e.cap>0&&level[e.to]<0) 52 { 53 level[e.to]=level[v]+1; 54 que.push(e.to); 55 } 56 } 57 } 58 } 59 60 //通过DFS寻找增广路 61 int dfs(int v,int t,int f) 62 { 63 if(v==t) 64 return f; 65 66 for(int &i=iter[v];i<G[v].size();i++) 67 { 68 edge &e=G[v][i]; 69 if(e.cap>0&&level[v]<level[e.to]) 70 { 71 int d=dfs(e.to,t,min(f,e.cap)); 72 if(d>0) 73 { 74 e.cap-=d; 75 G[e.to][e.rev].cap+=d; 76 return d; 77 } 78 } 79 } 80 81 return 0; 82 } 83 84 //求解从s到t的最大流 85 int max_flow(int s,int t) 86 { 87 int flow=0; 88 89 while(true) 90 { 91 bfs(s); 92 if(level[t]<0) 93 return flow; 94 memset(iter,0,sizeof(iter)); 95 int f; 96 while((f=dfs(s,t,INF))>0) 97 flow+=f; 98 } 99 }