結果

問題 No.1301 Strange Graph Shortest Path
ユーザー otogawa
提出日時 2025-04-22 11:11:50
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 206 ms / 3,000 ms
コード長 1,860 bytes
コンパイル時間 2,579 ms
コンパイル使用メモリ 207,440 KB
実行使用メモリ 42,276 KB
最終ジャッジ日時 2025-04-22 11:12:00
合計ジャッジ時間 9,616 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 33
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

#define int ll
#define fast_io cin.tie(0)->sync_with_stdio(0);
#define endl '\n'
typedef long long ll;

const int INF = 1e18;

struct mincf {
	using T = pair<int, int>;
	struct E { int to, rev, cap, cost;};
	int n;
	vector<vector<E>> g;
	vector<int> h, d, pv, pe;
	mincf(int _n): n(_n), g(n), h(n), d(n), pv(n), pe(n) {}
	void add(int a, int b, int c, int w) {
		g[a].push_back({b, (int)g[b].size(), c, w});
		g[b].push_back({a, (int)g[a].size()-1, 0, -w});
	}
	T go(int s,int t,int f){
		priority_queue<T, vector<T>, greater<T>> q;
        fill(d.begin(), d.end(), INF);
		d[s] = 0;
		q.emplace(0, s);
		while (q.size()) {
			auto [a, v] = q.top(); q.pop();
            if (d[v] < a) continue;
			if (v == t) break;
            for (int i = 0; i < g[v].size(); i++) {
				E e = g[v][i];
				if (e.cap > 0) {
					int w = d[v]+e.cost+h[v]-h[e.to];
					if (w < d[e.to]) {
						d[e.to] = w;
						q.emplace(w, e.to);
						pv[e.to] = v;
						pe[e.to] = i;
					}
				}
			}
		}
		if (d[t] == INF) return T(0, 0);
        for (int i = 0; i < n; i++)
			h[i]=min(h[i]+min(d[i],d[t]),INF);
		int a=f;
		for (int v=t; v!=s; v=pv[v])
			a = min(a, g[pv[v]][pe[v]].cap);
		for (int v=t; v!=s; v=pv[v]){
			E& e = g[pv[v]][pe[v]];
			e.cap -= a;
			g[e.to][e.rev].cap += a;
		}
		return T(h[t], a);
	}
	T calc(int s,int t,int f){
		int a = 0, res = 0;
		while (f>0) {
			auto [qt, w] = go(s,t,f);
			if (w == 0) break;
			a += w;
			f -= w;
			res += qt*w;
		}
		return {a, res};
	}
};


int32_t main() {
	fast_io;

    int n, m; cin >> n >> m;

    mincf g(n);
    for (int i = 0; i < m; i++) {
        int u, v, w, t; cin >> u >> v >> w >> t; --u, --v;
        g.add(u, v, 1, w);
        g.add(v, u, 1, w);
        g.add(u, v, 1, t);
        g.add(v, u, 1, t);
    }
    cout << g.calc(0, n - 1, 2).second << endl;
}
0