网络流模板

哎,其实很久前就学过网络流了,但是一直嫌比较恶心就没有把他拿起认真学过。

现在重新补上。

因为我们熊本熊(网络流dalao)说这种算法一般出出来都不会故意卡数据什么的,那我就用标号法(层次图优化版)。

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define ll long long
#define il inline
#define db double
using namespace std;
int cap[445][445];//该数组用来记录残量和 
int dist[445];//保存层次图的深度 
il bool bfs(int src,int des)
{
    memset(dist,-1,sizeof(dist));//初始化 
    dist[src]=0;
    int t[445];
    int head=0,tail=1;
    while(head!=tail)//广搜求层次图深度 
    {
        int h=t[head++];
        for(int i=1;i<=n;i++)
        {
            if(cap[h][i]&&dist[i]==-1)
            {
                dist[i]=dist[h]+1;
                t[tail++]=i;
            }
        }
    }
    if(dist[des]==-1)//到不了终点 
    return 0;
    else
    return 1;
}
il int maxflow(int src,int des)
{
    int sum=0;
    while(bfs(src,des))
    {
        int low[445],pre[445];//low表示从i点最多能流出多少,pre记录前驱节点 
        low[src]=2e8;
        bool vis[445]={0};//标号 
        vis[src]=1;
        while(head!=tail)
        {
            int h=t[head++];
            for(int i=1;i<=n;i++)
            {
                if(vis[i]||cap[h][i]<=0||dist[i]!=dist[h]+1)
                break;
                vis[i]=1;
                low[i]=min(low[h],cap[h][i]);
                pre[i]=h;
                t[tail++]=i;
            }
        }
        if(!low[des])
        break;
        sum+=low[des];
        for(int i=des;i!=src;i=pre[i])//修改增广路上的流量 
        {
            cap[pre[i]][i]-=low[des];
            cap[i][pre[i]]+=low[des];
        }
    }
}
int main()
{
    
    return 0;
}

 

posted @ 2017-08-19 16:45  GSHDYJZ  阅读(179)  评论(0编辑  收藏  举报