Drainage Ditches(HDU1532,网络流)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532。

纯粹最大流,注意有重边,用Dinic。

#include<iostream>
#include<cstring>
#include<queue>
#define maxn 400
#define INF (1<<31)-1

using namespace std;

struct Edge
{
    int from,to,cap,flow;
    Edge(int u,int v,int c,int f):
        from(u),to(v),cap(c),flow(f) {}
};

struct Dinic
{
    int n,m,s,t;
    vector<Edge> edges;
    vector<int> G[maxn];
    bool vis[maxn];
    int d[maxn];
    int cur[maxn];

    void init(int n)
    {
        for (int i=0; i<n; i++)
            G[i].clear();
        edges.clear();
    }

    void Addedge(int from,int to,int cap)
    {
        edges.push_back(Edge(from,to,cap,0));
        edges.push_back(Edge(to,from,0,0));
        m = edges.size();
        G[from].push_back(m-2);
        G[to].push_back(m-1);
    }

    bool bfs()
    {
        memset(vis,false,sizeof(vis));
        queue<int> Q;
        Q.push(s);
        d[s] = 0;
        vis[s] = true;
        while (!Q.empty())
        {
            int x = Q.front();
            Q.pop();
            for (int i=0; i<G[x].size(); i++)
            {
                Edge& e = edges[G[x][i]];
                if (!vis[e.to] && e.cap>e.flow)
                {
                    vis[e.to] = true;
                    d[e.to] = d[x]+1;
                    Q.push(e.to);
                }
            }
        }
        return vis[t];
    }

    int dfs(int x,int a)
    {
        if (x == t || a == 0)
            return a;
        int flow = 0, f;
        for (int i=cur[x]; i<G[x].size(); i++)
        {
            Edge& e = edges[G[x][i]];
            if (d[e.to] == d[x]+1 && (f = dfs(e.to,min(a,e.cap-e.flow))) > 0)
            {
                e.flow += f;
                edges[G[x][i]^1].flow -= f;
                flow += f;
                a -= f;
                if (a == 0) break;
            }
        }
        return flow;
    }

    int Maxflow(int s,int t)
    {
        int flow = 0;
        while (bfs())
        {
            memset(cur,0,sizeof(cur));
            flow += dfs(s,INF);
        }
        return flow;
    }
};

int main()
{
    Dinic a;
    int m;

    while (cin>>m>>a.n)
    {
        a.init(a.n);
        for (int i=0; i<m; i++)
        {
            int from,to,cap;

            cin>>from>>to>>cap;
            a.Addedge(from,to,cap);
        }
        a.s = 1; a.t = a.n;
        cout<<a.Maxflow(a.s,a.t)<<endl;
    }

    return 0;
}


你可能感兴趣的:(Drainage Ditches(HDU1532,网络流))