最大流KK算法

最大流KK算法

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define MAX 0x3f3f3f3f
using namespace std;

int map[300][300];
int pre[300];
int n,m;

int DFS(int s, int t, int f)
{
    if(s==t)
        return f;//找到终点了,此时剩下的流量就是能获得的流量
    for(int i=1; i<=n; i++)
    {
        if(map[s][i]>0 && pre[i]==0)//从s开始找
        {
            pre[i]=1;
            int d=DFS(i,t,min(f,map[s][i]));//问有没有增广路
            if(d>0)
            {
                map[s][i] -= d;
                map[i][s] += d;
                return d;
            }
        }
    }
    return 0;
}

int KK(int s, int t)
{
    int maxflow=0;
    while(true)
    {
        memset(pre, 0, sizeof(pre));
        int f= DFS(s,t,MAX);//不断找s到t的增广路
        if(f == 0)
            return maxflow; //找不到了就回去
        maxflow += f;//找到一个流量f的就赚了
    }
}

int main()
{
    while(~scanf("%d %d", &m, &n))
    {
        memset(map,0,sizeof(map));
        int a,b,c;
        for(int i=1; i<=m; i++)
        {
            scanf("%d %d %d", &a, &b, &c);
            map[a][b] += c;
        }
        int ans=KK(1,n);
        printf("%d
", ans);
    }
    return 0;
}