杭电ACM1532(最大流)

来源:互联网 发布:淘宝订单信息编辑 编辑:程序博客网 时间:2024/06/13 12:30
#include <iostream>#include <queue>using namespace std;#define MAXN 200#define MAXC 10000000int f[ MAXN ][ MAXN ];int previous[ MAXN ];queue<int> q;int N, M, S, E, C;void init(){for(int i = 0; i < MAXN; i ++){for(int j = 0; j < MAXN; j ++){f[ i ][ j ] = 0;}}}bool BFS(int src, int dst){int u;int *v = new int[ M ];for(int i = 0; i < M; i ++){v[ i ] = 0;}while(!q.empty()){q.pop();}q.push(src);previous[ src ] = -1;v[ src ] = 1;while(!q.empty()){u = q.front();q.pop();if(u == dst){break;}for(int i = 0; i < M; i ++){if(f[ u ][ i ] != 0 && v[ i ] == 0){q.push(i);previous[ i ] = u;v[ i ] = 1;}}}if(u == dst){return true;}else{return false;}}int EK(int src, int dst){int t, minflow;int ans = 0;while(BFS(src, dst)){t = dst;minflow = MAXC;while(t != src){if(f[ previous[ t ] ][ t ] < minflow) {minflow = f[ previous[ t ] ][ t ];}t = previous[ t ];}ans += minflow;t = dst;while(t != src){f[ previous[ t ] ][ t ] -= minflow;f[ t ][ previous[ t ] ] += minflow;t = previous[ t ];}}return ans;}int main(){while(scanf("%d %d", &N, &M) != EOF){init();while(N > 0){scanf("%d %d %d", &S, &E, &C);f[ S - 1 ][ E - 1 ] += C;N --;}printf("%d\n", EK(0, M - 1));}return 0;}