DINIC算法模板

//定义一个名为F的网络流:NetWorkFlow F(n,S,T);
//复杂度V^2*E
struct NetWorkFlow
{
    struct Flownode
    {
        int vi,id;
        int wi;
    };
    int S,T;
    const int inf = 0x3f3f3f3f;
    std::vector<int> rk,cur;
    std::vector<std::vector<Flownode>> r;
    NetWorkFlow(int n,int s,int t) : r(n + 1),rk(n + 1,0),cur(n + 1),S(s),T(t){}

    int bfs()
    {
        std::fill(rk.begin(), rk.end(), 0);
        //memset(&rk[0],0,rk.size() * sizeof rk[0]);
        queue<int> q;
        q.push(S);
        rk[S] = 1;
        while(q.size())
        {
            int x = q.front();q.pop();
            for(auto tmp:r[x])
            {
                if(!rk[tmp.vi] && tmp.wi)
                {
                    rk[tmp.vi] = rk[x] + 1;
                    q.push(tmp.vi);
                }
            }
        }
        return rk[T];
    }

    int dfs(int x,int fl)
    {
        if(x == T) return fl;
        int res = fl;
        for(int &i = cur[x];i < r[x].size();i ++)
        {
            Flownode tmp = r[x][i];
            if(rk[tmp.vi] == rk[x] + 1 && tmp.wi)
            {
                int flow = dfs(tmp.vi,min(tmp.wi,res));
                r[x][i].wi -= flow;
                r[tmp.vi][r[x][i].id].wi += flow;
                res -= flow;
                if(res <= 0)
                    break;
            }
        }
        if(fl == res) rk[x] = 0;
        return fl - res;
    }

    void addEdge(int u,int v,int val)
    {
        r[u].push_back({v,(int)r[v].size(),val});
        r[v].push_back({u,(int)r[u].size() - 1,0});
    }

    int Mxflow()
    {
        int ans = 0;
        while(bfs())
        {
            for(auto &v:cur)
                v = 0;
            ans += dfs(S,inf);
        }
        return ans;
    }
    
};

 

posted @ 2023-07-27 17:23  CECY  阅读(28)  评论(0)    收藏  举报