Hdu 1532 && Hdu 3549 简单最大流初学者必做题

来源:互联网 发布:英语新闻听力 知乎 编辑:程序博客网 时间:2024/05/20 11:19

花费以上午学了简单最大流,对于最大流有了一定的了解,而这两道题,正好练练手,代码都是一样的,下面仅仅附上1532这道题

问题:

从s点能流入到t点的最大值。

解决办法:

EK算法:

每次找出一条到达t点的路然后更新该条路上的正向流量,和反向流量,如果找不到了路,说明当前一是最大流。下面附上代码。

#include<cstdio>#include<queue>#include<cstring>#include<iostream>using namespace std;int cap[205][205],flow[205][205],n,m;int Max_flow(){    int a[207];    queue<int> q;    memset(flow,0,sizeof(flow));    int s = 1,t = m,f = 0,p[1001];    while(1)    {        memset(a,0,sizeof(a));        q.push(s);        a[s] = 9999999;        while(!q.empty())        {            int u = q.front();q.pop();            for(int v =1;v<=m;v++)            {                if(!a[v]&&cap[u][v]>flow[u][v])                {                    a[v] =min(a[u],cap[u][v]-flow[u][v]);//找到一条路,并找到这条路上的最小流量                    q.push(v);                    p[v] = u;                }            }        }        if(a[t]==0)break;        for(int u = t;u!=s;u = p[u])// 更新流量        {            flow[p[u]][u] += a[t];            flow[u][p[u]] -= a[t];        }        f+=a[t];    }    return f;}int main(){    int u,v,w;    while(~scanf("%d%d",&n,&m))    {        memset(cap,0,sizeof(cap));        while(n--)        {            scanf("%d%d%d",&u,&v,&w);            cap[u][v] += w;        }        cout<<Max_flow()<<endl;    }}


0 0