ditches,HDU_1532 Drainage Ditches

很明显的最大流题目,通过不断寻找增广路,每找到一条就做相应的修改,直到找不到为止
#include #include #define max 100000000 #define num 205 using namespace std; int n, m, f; //map[][]记录权值,mark[]标记是否访问过,pre[]记录增广路 int map[num][num], mark[num], pre[num]; void init() { int a, b, c; memset(map, 0, sizeof(map)); f = 0; for (int i = 0; i < m; ++ i) { cin >> a >> b >> c; map[a][b] = c; } } void max_flow() { //不断寻找增广路,知道找不到为止,找不到的标志为 mark[n]==0 while (1) { queue q; memset(mark, 0, sizeof(mark)); memset(pre, 0, sizeof(pre)); mark[1] = 1; q.push(1); while (!q.empty()) { int cur = q.front(); q.pop(); //找到了增广路,跳出 if (cur == n) break; for (int i = 1; i <= n; ++ i) { if (mark[i] == 0 && map[cur][i] > 0) { mark[i] = 1; q.push(i); pre[i] = cur; } } } //如果没找到可增广的路,直接跳出 if (mark[n] == 0) break; int min = max; //计算该增广路最大可增加的流量 for (int i = n; i != 1; i = pre[i]) { if (min > map[pre[i]][i]) { min = map[pre[i]][i]; } } //原路返回,修改路劲上边的权值 for (int i = n; i != 1; i = pre[i]) { map[pre[i]][i] -= min; map[i][pre[i]] += min; } //总流量增加 f += min; } } int main() { while (cin >> m >> n) { init(); max_flow(); cout << f << endl; } return 0; }
Tags:  都市少帅1532 drainage ditches

延伸阅读

最新评论

发表评论