Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <vector>
- #include <queue>
- #define pb push_back
- #define Nmax 1005
- #define Mmax 5005
- #define INF 2147000000
- using namespace std;
- queue< int > Q;
- vector< int > v[Nmax];
- int F[Nmax][Nmax],C[Nmax][Nmax];
- int prev[Nmax];
- int N,M,S,D;
- inline int BF()
- {
- vector< int >:: iterator it;
- int f;
- memset(prev,0,sizeof(prev));
- while( !Q.empty() ) Q.pop();
- Q.push(S);
- while( ! Q.empty() )
- {
- f = Q.front();
- Q.pop();
- if( f == D ) continue;
- for( it=v[f].begin(); it!=v[f].end(); ++it)
- if( !prev[*it] && C[f][*it] > F[f][*it] )
- {
- prev[ *it ] = f;
- Q.push( *it );
- }
- }
- return prev[D];
- }
- int main()
- {
- vector< int >:: iterator it;
- int i,x,y,z, flow=0,wh,fmin;
- freopen("maxflow.in","r",stdin);
- freopen("maxflow.out","w",stdout);
- scanf("%d%d",&N,&M);
- for(i=1;i<=M;++i)
- {
- scanf("%d%d%d",&x,&y,&z);
- v[x].pb(y);
- v[y].pb(x);
- C[x][y] = z;
- }
- S=1; D=N;
- while( BF() )
- {
- for( it=v[D].begin(); it!=v[D].end(); ++it)
- if( prev[*it] )
- {
- prev[D] = *it;
- fmin = INF;
- for( wh=D; wh!=S; wh=prev[wh] )
- fmin = min(fmin, C[prev[wh]][wh] - F[prev[wh]][wh] );
- if( !fmin ) continue;
- flow += fmin;
- for( wh=D; wh!=S; wh=prev[wh] )
- {
- F[prev[wh]][wh] += fmin;
- F[wh][prev[wh]] -= fmin;
- }
- }
- }
- printf("%d\n",flow);
- fclose(stdin); fclose(stdout);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement