HDU1532 网络流:最大流之福德福克森算法

问题描述:约翰是个农民,每次下雨的时候他的庄家总是会被淹没,这就意味着当庄家被水淹后需要很长时间才能重新生长出来,因此,约翰已经建立了一系列排水管道为了使他的庄家尽可能被淹没的最少,也就是说管道的排水量必须很大.作为一名工程师,约翰可以计算出管道网能排水的最大能力.

Input:输入包含多组用例,每组用例第一行是两个数N,M,N表示一共有N个管道,M表示一共有M个点,接下来N行每行输入三个数字a,b,c表示,a管道口到b管道口最大排水能力为c.

Output:对每一组用例,输出排水量的最大值

Sample Input:

5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10

Sample Output:

50

这里我采用的是Fold-Fulkerson算法。

//这里的起点默认为1,终点为节点数M

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<string.h>
#define maxint 999999999
using namespace std;
int rest[500][500];//二位数组rest绘制有向图
int pre[500];//保存每次需找的增广路径的前驱
int Min;//写法原因Min需定义为全局变量
bool bfs(int M)//增广路径的搜索
{
    queue<int>que;
    bool vis[500];//常规搜索都有的标记数组vis;
    memset(vis,0,sizeof(vis));
    memset(pre,-1,sizeof(pre));//前驱数组初始化
    que.push(1);
    vis[1]=1;
    while(!que.empty())
    {
        int s=que.front();
        que.pop();
        if(s==M)
        {
            return true;
        }

for(int i=1;i<=M;i++)
        {
            if(rest[s][i]&&vis[i]==0)//rest[s][t]不为0说明选择的这条路径中从s点到达i点的通道还未被充满,说明当前存在增广路径
            {
                pre[i]=s;//前驱数组更新
          vis[i]=1;
                que.push(i);
            }
        }
    }
    return false;//若不存在增广路径则返回false说明找不到
}

void update(int M)//对每次所选的路径可增加流量更新,返回并加到总流量数sum中
{
    if(M==1)//从后往前找起,知道找到起点为止
        return;
    int s=pre[M];
    Min=min(Min,rest[s][M]);
    update(s);//回溯更新
    rest[s][M]-=Min;//正反路径进行更新的区别
    rest[M][s]+=Min;
}

int main()
{
    int a,b,c;
    int N,M;
    while(scanf("%d%d",&N,&M)!=EOF)
    {
        memset(rest,0,sizeof(rest));
        for(int i=1;i<=N;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            rest[a][b]+=c;//想清楚为什么是+不是=
        }
        int sum=0;
        while(bfs(M))
        {
            Min=maxint;//由于可能有多次路径选择所以需要在while内对全局变量Min进行更新
            update(M);
            sum+=Min;
        }
        printf("%d\n",sum);//输出到达终点可达到的最大流量
    }return 0;
}

时间: 2024-10-17 19:53:23

HDU1532 网络流:最大流之福德福克森算法的相关文章

POJ 3281 Dining (网络流最大流 拆点建图 Edmonds-Karp算法)

Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10159   Accepted: 4676 Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John has cooked fabulo

POJ训练计划3422_Kaka&#39;s Matrix Travels(网络流/费用流)

解题报告 题目传送门 题意: 从n×n的矩阵的左上角走到右下角,每次只能向右和向下走,走到一个格子上加上格子的数,可以走k次.问最大的和是多少. 思路: 建图:每个格子掰成两个点,分别叫"出点","入点", 入点到出点间连一个容量1,费用为格子数的边,以及一个容量∞,费用0的边. 同时,一个格子的"出点"向它右.下的格子的"入点"连边,容量∞,费用0. 源点向(0,0)的入点连一个容量K的边,(N-1,N-1)的出点向汇点连一

POJ训练计划2516_Minimum Cost(网络流/费用流)

解题报告 题意: 有n个商店,m个提供商,k种商品</span> n*k的矩阵,表示每个商店需要每个商品的数目: m*k矩阵,表示每个提供商拥有每个商品的个数 然后对于每个物品k,都有n*m的矩阵 i行j列表示 从j提供商向i商店运送一个k商品的代价是多少 判断所有的仓库能否满足所有客户的需求,如果可以,求出最少的运输总费用 思路: 建图的题,不能直接把所有信息建成图,因为n和m跟k都有关系,如果那样子建图的话,就要把k种拆成m类,每个仓库连向该仓库的第k种,然后再和n连线,有费用, 不过这样

POJ 1459 Power Network(网络流 最大流 多起点,多汇点)

Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 22987   Accepted: 12039 Description A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport lines. A node u may be supplied

POJ 1273 Drainage Ditches(网络流 最大流)

Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 55893   Accepted: 21449 Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by

hdu 4289 Control(网络流 最大流+拆点)(模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4289 Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1545    Accepted Submission(s): 677 Problem Description You, the head of Department o

POJ 2455 Secret Milking Machine(搜索-二分,网络流-最大流)

Secret Milking Machine Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9658   Accepted: 2859 Description Farmer John is constructing a new milking machine and wishes to keep it secret as long as possible. He has hidden in it deep within

【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流

题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线距离不超过R,且巫妖看到小精灵的视线没有被树木阻挡(也就是说,巫妖和小精灵的连线与任何树木都没有公共点)的话,巫妖就可以瞬间杀灭一个小精灵. 在森林里有N个巫妖,每个巫妖释放Frozen Nova之后,都需要等待一段时间,才能再次施放.不同的巫妖有不同的等待时间和施法范围,但相同的是,每次施放都可以

[笔记] 网络流-最大流 POJ-1273\HDU-4240

[1] POJ-1273 题目:http://poj.org/problem?id=1273 最直接的最大流问题,用了Ford-Fulkerson方法,DFS随机搜索增广路. 算法原理参考:http://blog.csdn.net/smartxxyx/article/details/9293665 /************************ POJ-1273* Ford-Fulkerson***********************/#include <stdio.h> #inclu