最水的一个最大流题目,本题需要注意的就是图中可能有平行边,这个时候只需要把同起点同终点的变得值加起来。 有点小激动。。。 #include<iostream> #include<cstring> #include<queue> #include<cfloat> using namespace std; queue<int> q; int main(void) { int n,m,i,f,u,v; int from,to,w; int cap[201][201],a[201],p[201]; int flow[201][201]; while( cin >> m >> n ) { memset(cap,0,sizeof(cap)); memset(flow,0,sizeof(flow)); for( i = 1; i <= m; i++ ) { cin >> from >> to >> w; cap[from][to] += w; } f = 0; while(1) { memset(a,0,sizeof(a)); a[1] = INT_MAX; q.push(1); while( !q.empty() ) { u = q.front();q.pop(); for( v = 1;v <= n;v++) if( !a[v] && cap[u][v] > flow[u][v] ) { p[v] = u;q.push(v); a[v] = a[u]<(cap[u][v] - flow[u][v])?a[u]:(cap[u][v] - flow[u][v]); } } if( a[n] == 0 ) break; for( u = n; u != 1; u = p[u]) { flow[ p[u] ][u] += a[n]; flow[u][ p[u] ] -= a[n]; } f += a[n]; } cout << f << endl; } return 0; }