結果

問題 No.654 Air E869120
ユーザー pote-bokkopote-bokko
提出日時 2024-03-07 11:38:33
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 3,996 bytes
コンパイル時間 2,836 ms
コンパイル使用メモリ 227,664 KB
実行使用メモリ 6,676 KB
最終ジャッジ日時 2024-03-07 11:38:44
合計ジャッジ時間 9,875 ms
ジャッジサーバーID
(参考情報)
judge15 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,676 KB
testcase_01 WA -
testcase_02 WA -
testcase_03 AC 2 ms
6,676 KB
testcase_04 AC 2 ms
6,676 KB
testcase_05 AC 2 ms
6,676 KB
testcase_06 AC 2 ms
6,676 KB
testcase_07 AC 3 ms
6,676 KB
testcase_08 AC 2 ms
6,676 KB
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 WA -
testcase_23 AC 9 ms
6,676 KB
testcase_24 WA -
testcase_25 AC 6 ms
6,676 KB
testcase_26 WA -
testcase_27 AC 5 ms
6,676 KB
testcase_28 AC 6 ms
6,676 KB
testcase_29 AC 5 ms
6,676 KB
testcase_30 AC 5 ms
6,676 KB
testcase_31 AC 5 ms
6,676 KB
testcase_32 AC 5 ms
6,676 KB
testcase_33 RE -
testcase_34 AC 4 ms
6,676 KB
testcase_35 AC 2 ms
6,676 KB
testcase_36 AC 2 ms
6,676 KB
testcase_37 AC 2 ms
6,676 KB
testcase_38 AC 2 ms
6,676 KB
testcase_39 AC 2 ms
6,676 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

// STLのインクルード
#include <bits/stdc++.h>
using namespace std;

// // ACLのインクルード(デフォルトはコメントアウト)
// #include <atcoder/all>
// using namespace atcoder;

// for文の略記
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define per(i, n) for (ll i = (ll)(n-1); i >= 0; i--)

// vectorのソート
#define all(x) x.begin(), x.end()

// 型の略記 (競プロならでは)
using ll = long long;
using pii = pair<ll, ll>;
using pll = pair<long long, long long>;
using vi = vector<ll>;
using vl = vector<long long>;
using vs = vector<string>;
using vc = vector<char>;
using vpii = vector<pair<ll, ll>>;
using vpll = vector<pair<long long, long long>>;
using vpsi = vector<pair<string, ll>>;
using vvi = vector<vector<ll>>;
using vvpii = vector<vector<pair<ll, ll>>>;
using vvl = vector<vector<long long>>;
using vvc = vector<vector<char>>;

template<typename T>
using priority_queue_up = priority_queue<T, vector<T>, greater<T>>;

// MOD計算で使う
#define MOD 1000000007
#define MOD2 998244353

// YES-NOで答える質問で使う(fがTrueならYes)
void cout_yn(bool f){
    if(f)cout << "Yes" << endl;
    else cout << "No" << endl;
}

// 木の前順走査
void dfs_preorder(ll v, vvi &tree, vi &output){
    output.push_back(v);
    rep(i, tree[v].size()){
        dfs_preorder(tree[v][i], tree, output);
    }
}
// 木の後順走査
void dfs_postorder(ll v, vvi &tree, vi &output){
    rep(i, tree[v].size()){
        dfs_preorder(tree[v][i], tree, output);
    }
    output.push_back(v);
}

// n頂点m辺の無向グラフを隣接リストで受け取る.
// 頂点番号は1-indexedとして入力される想定.
vector<vector<ll>> input_undir_graph(ll n, ll m){
    ll a, b;
    vector<vector<ll>> g(n);
    rep(i, m){
        cin >> a >> b;
        a--, b--;
        g[a].push_back(b); // a->b へ向かう辺
        g[b].push_back(a); // b->a へ向かう辺
    }
    return g;
}

// n頂点m辺の有向グラフを隣接リストで受け取る.
// 頂点番号は1-indexedとして入力される想定.
vector<vector<ll>> input_dir_graph(ll n, ll m){
    ll a, b;
    vector<vector<ll>> g(n);
    rep(i, m){
        cin >> a >> b;
        a--, b--;
        g[a].push_back(b); // a->b へ向かう辺
    }
    return g;
}

#define INF 1e18

struct edge{
    ll to, cap, p, q, rev;
};

vector<vector<edge>> G;
vector<map<ll, ll>> used;
ll n, m;
ll d;

void add_edge(ll u, ll v, ll c, ll p, ll q){
    G[u].push_back((edge){v, c, p, q, (ll)(G[v].size())});
    G[v].push_back((edge){u, 0, q, p, (ll)(G[u].size()-1)});
}

ll dfs(ll v, ll p, ll t, ll tq, ll f){
    if(v == t && p == tq){
        return f;
    }
    used[v][p] = 1;
    vector<edge> &E = G[v];
    rep(i, E.size()){
        edge &e = E[i];
        if(e.p != p)continue;
        if(e.cap > 0 && !used[e.to][e.q]){
            ll w = dfs(e.to, e.q, t, tq, min(f, e.cap));
            if(w > 0){
                e.cap -= w;
                G[e.to][e.rev].cap += w;
                return w;
            }
        }
    }
    return 0;
}

ll max_flow(ll s, ll p, ll t, ll tq){
    ll flow = 0;
    for(;;){
        for(ll i=0; i<n; i++)used[i].clear();
        ll f = dfs(s, p, t, tq, INF);
        if(f == 0)break;
        flow += f;
        /* cout << flow << endl; */
    }
    return flow;
}

// main関数
int main(void){
    cin >> n >> m >> d;
    vector<set<ll>> time(n);
    G.resize(n);
    used.resize(n);
    ll u, v, p, q, w;
    rep(i, m){
        cin >> u >> v >> p >> q >> w;
        u--, v--;
        add_edge(u, v, w, p, q+d);
        time[u].insert(p);
        time[v].insert(q+d);
    }
    rep(i, n){
        if(time[i].size() == 1)continue;
        for(auto itr=time[i].begin(); itr!=time[i].end(); itr++){
            auto nx = itr; ++nx;
            add_edge(i, i, INF, *itr, *nx);
            if(nx == time[i].end())break;
        }
    }
    cout << max_flow(0, *time[0].begin(), n-1, *(--(time[n-1].end()))) << endl;
    return 0;
}


0