結果
| 問題 | 
                            No.654 Air E869120
                             | 
                    
| コンテスト | |
| ユーザー | 
                             NAMIDAIRO
                         | 
                    
| 提出日時 | 2024-04-24 02:01:07 | 
| 言語 | C++17  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 21 ms / 2,000 ms | 
| コード長 | 2,951 bytes | 
| コンパイル時間 | 1,461 ms | 
| コンパイル使用メモリ | 112,948 KB | 
| 最終ジャッジ日時 | 2025-02-21 08:48:02 | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 5 | 
| other | AC * 35 | 
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <set>
#include <iomanip>
using namespace std;
typedef long long ll;
#define rep(i, n) for(int i = 0; i < (n); i++)
template<class T>
using vi = vector<T>;
template<class T>
using vii = vector<vi<T>>;
template<class T>
using viii = vector<vii<T>>;
struct Dinic {
private:
    const long long inf = 1e18;
    vector<int> dist; //sからの距離
    vector<int> iter; //どこまで調べたか
public:
    struct edge {
        int to, rev; long long cap;
        edge(int t = 0, int r = 0, long long c = 0LL) : to(t), rev(r), cap(c) {}
    };
    int n;
    vector<vector<edge>> to;
    Dinic(int n_ = 1) : n(n_), to(n_), dist(n_), iter(n_) {}
    void addedge(int u, int v, long long cap) {//u->vにcapの容量
        int su = (int)to[u].size(), sv = (int)to[v].size();
        to[u].push_back({ v, sv, cap });
        to[v].push_back({ u, su, 0 });
    }
    long long dfs(int v, int t, long long f) { //t: 終点, f: flow
        if (v == t) return f;
        int sv = (int)to[v].size();
        for (int& i = iter[v]; i < sv; i++) {
            edge& nv = to[v][i];
            if (dist[nv.to] <= dist[v] || nv.cap == 0) continue; //here??
            long long nf = dfs(nv.to, t, min(f, nv.cap));
            if (nf > 0) {
                nv.cap -= nf;
                to[nv.to][nv.rev].cap += nf;
                return nf;
            }
        }
        return 0;
    }
    void bfs(int s) {
        dist.assign(n, -1);
        queue<int> q;
        q.push(s);
        dist[s] = 0;
        while (!q.empty()) {
            int v = q.front();
            q.pop();
            for (auto nv : to[v]) {
                if (nv.cap > 0 && dist[nv.to] < 0) {
                    dist[nv.to] = dist[v] + 1;
                    q.push(nv.to);
                }
            }
        }
    }
    long long maxflow(int s, int t) {//s:始点, t:終点
        long long res = 0, flow = 0;
        while (true) {
            bfs(s);
            if (dist[t] < 0) break;
            iter.assign(n, 0);
            while (flow = dfs(s, t, inf)) res += flow;
        };
        return res;
    }
};
int main()
{
    int n, m, d;
    cin >> n >> m >> d;
    vi<int> u(m), v(m), p(m), q(m); vi<ll> w(m);
    rep(i, m) cin >> u[i] >> v[i] >> p[i] >> q[i] >> w[i];
    rep(i, m) u[i]--, v[i]--;
    rep(i, m) q[i] += d;
    vi<map<int, int>> mp(n);
    rep(i, m) {
        mp[u[i]][p[i]];
        mp[v[i]][q[i]];
    }
    const ll inf = 1e18;
    Dinic ff(n * m);
    int idx = 0;
    rep(i, n) {
        bool ng = true;
        for (auto& elem : mp[i]) {
            elem.second = idx;
            if (ng) ng = false;
            else ff.addedge(idx - 1, idx, inf);
            idx++;
        }
    }
    rep(i, m) ff.addedge(mp[u[i]][p[i]], mp[v[i]][q[i]], w[i]);
    ll res = ff.maxflow(0, idx - 1);
    cout << res << endl;
    return 0;
}
            
            
            
        
            
NAMIDAIRO