POJ 1273
最大流的入门题,完全不需要建模,直接把1作为源点,m作为汇点用EK算法跑一遍即可。
这次第一次用C++写,EK使用的是网上找的模版,思想也许没有完全理解,待理解之后再写一篇EK的学习笔记吧,先暂时用着模版。
#include<iostream> #include<stdio.h> #include<queue> #include<cstring> using namespace std; const int MAX_DIT_NUM = 210 , MAX_INTERSECTION_NUM = 210 , INF = 0x7fffffff; int cap[ MAX_DIT_NUM ][ MAX_DIT_NUM ] , restFlow[ MAX_DIT_NUM ] , pre[ MAX_DIT_NUM ]; queue<int> que; int bfs( int src , int dest ) { while( !que.empty() ) { que.pop(); } for( int i = -1 ; i < MAX_INTERSECTION_NUM ; i++) { pre[ i ] = -1; } pre[ src ] = 0; restFlow[ src ] = INF; que.push( src ); while( !que.empty() ) { int now = que.front(); que.pop(); if( now == dest ) { break; } for( int i = 1 ; i <= dest ; i++ ) { if( i != src && cap[ now ][ i ] > 0 && pre[ i ] == -1 ) { pre[ i ] = now; restFlow[ i ] = min( cap[ now ][ i ] , restFlow[ now ] ); que.push( i ); } } } if( pre[ dest ] == -1 ) { return -1; } else { return restFlow[ dest ]; } } int getMaxFlow( int src, int dest ) { int sumFlow = 0 , incrs = bfs( src , dest); while( incrs != -1 ) { int now = dest; while( now != src ) { int last = pre[ now ]; cap[ last ][ now ] -= incrs; cap[ now ][ last ] += incrs; now = last; } sumFlow += incrs; incrs = bfs( src , dest ); } return sumFlow; } int main() { int ditNum ,intrscNum; while( scanf("%d%d", &ditNum , &intrscNum) != EOF ) { memset( cap , 0 , sizeof(cap) ); memset( restFlow , 0 ,sizeof(restFlow)); for( int i = 0 ; i < ditNum ; i++) { int stt,end,flow; scanf("%d%d%d", &stt , &end , &flow ); if( stt != end ) { cap[ stt ][ end ] += flow; } } printf("%d\n", getMaxFlow( 1 , intrscNum )); } return 0; }