现在的位置: 首页 > 算法 > 正文

hdu 1532 && poj 1273 (基础最大流)

2018年12月27日 算法 ⁄ 共 902字 ⁄ 字号 评论关闭

刚学最大流算法,一道简单的最大流问题,思路就是找出每条从s->t的路径中最小的残量a[t](最大流量-已流的流量)将路径上的流量都增加a[t],直到残量为0;



#include<iostream>
#include<stdio.h>
#include<queue>
#include<string.h>
#define INF 99999999
using namespace std;
int m,n,map[250][250],a[250],flow[250][250],p[250];
int EK(int s,int t)
{
    int sum=0;
    queue<int>q;
    memset(flow,0,sizeof(flow));
    for(;;)
    {
        memset(a,0,sizeof(a));//记录残量
        a[s]=INF;
        q.push(s);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            for(int i=2;i<=n;i++)
            if(a[i]==0&&map[u][i]>flow[u][i])
            {
                p[i]=u;q.push(i);
                a[i]=a[u]<map[u][i]-flow[u][i]?a[u]:map[u][i]-flow[u][i];
            }
        }//找出s->t路径的最小残量
            if(a[t]==0)break;//最小残量为0;s->t之间流量达到最大
            for(int i=t;i!=s;i=p[i])//s->t路径上的流量都加上最小残量a[t];
            {
                flow[p[i]][i]+=a[t];
                flow[i][p[i]]-=a[t];
            }
            sum+=a[t];//记录流量
    }
    return sum;
}

int main()
{
    int i,j,c,b,x;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        memset(map,0,sizeof(map));
        memset(p,0,sizeof(p));
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&c,&b,&x);
            map[c][b]+=x;//变态,还要考虑重边
        }
        j=EK(1,n);
        printf("%d\n",j);
    }
    return 0;
}

抱歉!评论已关闭.