#include<cstdio> #include<iostream> #include<vector> #include<queue> #include<algorithm> using namespace std; #define min( x, y ) (x) < (y) ? (x) : (y) const int maxn = 100; const int INF = 0x3f3f3f3f; struct Edge { int from , to , cap , flow ; Edge(int u, int v , int c , int f ): from( u ) , to( v ) , cap( c ) , flow( f ) {} }; struct EdmondsKarp { int n,m; vector<Edge> edges; vector<int> G[maxn]; int a[maxn]; int p[maxn]; void init( int n ){ for( int i = 0 ; i < n ; i++ ) G[i].clear(); edges.clear(); } void AddEdge( int from , int to , int cap ){ edges.push_back( Edge( from , to , cap , 0 ) ); edges.push_back( Edge( to ,from , 0 , 0 ) ); m = edges.size() ; G[from].push_back( m-2 ); G[to].push_back( m-1 ); } int Maxflow( int s , int t ){ int flow = 0; for( ; ; ) { memset( a , 0 ,sizeof( a ) ); queue<int> Q; Q.push( s ); a[s] = INF; while( !Q.empty() ) { int x = Q.front() ; Q.pop(); for( int i = 0 ; i < G[x].size() ; i++ ) { Edge& e = edges[ G[x][i] ] ; if( !a[e.to] && (e.cap > e.flow) ) { p[ e.to ] = G[x][i]; a[ e.to ] = min( a[x] , e.cap - e.flow ); Q.push( e.to ); } } if( a[t] ) break; } if( !a[t] ) break; for(int u = t ; u != s ; u = edges[ p[u] ].from ) { edges[p[u]].flow += a[t]; edges[p[u]^1].flow -= a[t]; } flow += a[t]; } return flow; } }; int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif EdmondsKarp graph; int m, n; int from , to , cap ; while( ~scanf("%d%d",&m , &n) ) { graph.init( graph.n ); for( int i = 0 ; i < n ; i++ ) { scanf("%d%d%d",&from , &to , &cap ); graph.AddEdge( from , to , cap ); } cout << "Max flow : " << graph.Maxflow( 0 , m-1 ) << endl; } return 0; }
时间: 2024-10-10 10:09:57