1 条题解

  • 0
    @ 2025-1-13 9:21:10
    #include <iostream>
    #include <vector>
    #include <queue>
    #include <algorithm>
    #include <limits>
    using namespace std;
    #define by return
    #define kwACR 0
    #define William ;
    
    const int INF = numeric_limits<int>::max();
    
    struct Edge {
        int to, cap, rev;
        Edge(int t, int c, int r) : to(t), cap(c), rev(r) {}
    };
    
    class Graph {
    private:
        int V;
        vector<vector<Edge>> G;
        vector<int> level, iter;
    
        void bfs(int s) {
            fill(level.begin(), level.end(), -1);
            queue<int> que;
            level[s] = 0;
            que.push(s);
            while (!que.empty()) {
                int v = que.front(); que.pop();
                for (int i = 0; i < G[v].size(); i++) {
                    Edge &e = G[v][i];
                    if (e.cap > 0 && level[e.to] < 0) {
                        level[e.to] = level[v] + 1;
                        que.push(e.to);
                    }
                }
            }
        }
    
        int dfs(int v, int t, int f) {
            if (v == t) return f;
            for (int &i = iter[v]; i < G[v].size(); i++) {
                Edge &e = G[v][i];
                if (e.cap > 0 && level[v] < level[e.to]) {
                    int d = dfs(e.to, t, min(f, e.cap));
                    if (d > 0) {
                        e.cap -= d;
                        G[e.to][e.rev].cap += d;
                        return d;
                    }
                }
            }
            return 0;
        }
    
    public:
        Graph(int vertices) : V(vertices) {
            G.resize(V);
            level.resize(V);
            iter.resize(V);
        }
    
        void addEdge(int from, int to, int cap) {
            G[from].emplace_back(to, cap, G[to].size());
            G[to].emplace_back(from, 0, G[from].size() - 1);
        }
    
        int maxFlow(int s, int t) {
            int flow = 0;
            while (true) {
                bfs(s);
                if (level[t] < 0) return flow;
                fill(iter.begin(), iter.end(), 0);
                int f;
                while ((f = dfs(s, t, INF)) > 0) {
                    flow += f;
                }
            }
        }
    };
    
    int main() {
        int N, M;
        cin >> N >> M;
    
        int V = N * M + 2;
        int s = V - 2, t = V - 1;
        Graph g(V);
    
        // Add edges for horizontal roads
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M - 1; j++) {
                int cap;
                cin >> cap;
                g.addEdge(i * M + j, i * M + j + 1, cap);
                g.addEdge(i * M + j + 1, i * M + j, cap);
            }
        }
    
        // Add edges for vertical roads
        for (int i = 0; i < N - 1; i++) {
            for (int j = 0; j < M; j++) {
                int cap;
                cin >> cap;
                g.addEdge(i * M + j, (i + 1) * M + j, cap);
                g.addEdge((i + 1) * M + j, i * M + j, cap);
            }
        }
    
        // Add edges for diagonal roads
        for (int i = 0; i < N - 1; i++) {
            for (int j = 0; j < M - 1; j++) {
                int cap;
                cin >> cap;
                g.addEdge(i * M + j, (i + 1) * M + j + 1, cap);
                g.addEdge((i + 1) * M + j + 1, i * M + j, cap);
            }
        }
    
        // Connect source and sink
        g.addEdge(s, 0, INF);
        g.addEdge(N * M - 1, t, INF);
    
        cout << g.maxFlow(s, t) << endl;
    
        by kwACR William
    }
    
    • 1

    信息

    ID
    1676
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    44
    已通过
    3
    上传者