結果
| 問題 | No.3668 Minimum Cut |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-09-04 23:48:23 |
| 言語 | C++23 (gcc 15.3.0 + boost 1.92.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,083 bytes |
| 記録 | |
| コンパイル時間 | 2,352 ms |
| コンパイル使用メモリ | 345,456 KB |
| 実行使用メモリ | 6,272 KB |
| 最終ジャッジ日時 | 2026-09-04 23:48:31 |
| 合計ジャッジ時間 | 7,231 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 21 TLE * 1 -- * 17 |
ソースコード
#include <bits/stdc++.h>
#define fi first
#define se second
#define rep(i,s,n) for (int i = (s); i < (n); ++i)
#define rrep(i,g,n) for (int i = (n)-1; i >= (g); --i)
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
#define len(x) (int)(x).size()
#define dup(x,y) (((x)+(y)-1)/(y))
#define pb push_back
#define eb emplace_back
#define Field(T) vector<vector<T>>
using namespace std;
using ll = long long;
using ull = unsigned long long;
template<typename T> using pq = priority_queue<T,vector<T>,greater<T>>;
using P = pair<int,int>;
template<class T>bool chmax(T&a,T b){if(a<b){a=b;return 1;}return 0;}
template<class T>bool chmin(T&a,T b){if(b<a){a=b;return 1;}return 0;}
template <typename T>
struct MaxFlow {
struct edge {
int to;
T cap;
int rev;
bool is_rev;
};
vector<vector<edge>> G;
vector<int> dist, iter;
MaxFlow() = default;
explicit MaxFlow(int n) : G(n) {}
void add_edge(int from, int to, T cap = 1) {
G[from].emplace_back(edge{to, cap, (int)G[to].size(), 0});
G[to].emplace_back(edge{from, 0, (int)G[from].size()-1, 1});
}
void debug() {
for (int i = 0; i < (int)G.size(); ++i) {
for (edge &e : G[i]) {
if (e.is_rev) continue;
edge &rev_e = G[e.to][e.rev];
cout << i << " -> " << e.to << " : " << "(" << rev_e.cap << "/" << e.cap + rev_e.cap << ")" << endl;
}
}
}
void bfs(const int &s) {
dist.assign(G.size(), -1);
dist[s] = 0;
queue<int> que;
que.push(s);
while(!que.empty()) {
int v = que.front();
que.pop();
for (edge &e : G[v]) {
if (e.cap == 0 || dist[e.to] >= 0) continue;
dist[e.to] = dist[v] + 1;
que.push(e.to);
}
}
}
T dfs(int v, const int &t, T f) {
if (v == t) return f;
T ret = 0;
for (int& i = iter[v]; i < (int)G[v].size(); ++i) {
edge& e = G[v][i];
if (e.cap == 0 || dist[v] >= dist[e.to]) continue;
T d = dfs(e.to, t, min(f - ret, e.cap));
if (d == 0) continue;
e.cap -= d;
G[e.to][e.rev].cap += d;
ret += d;
if (f == ret) break;
}
return ret;
}
T flow(int s, int t, T f_limit = numeric_limits<T>::max()) {
T ret = 0;
queue<int> que;
while(true) {
bfs(s);
if (dist[t] == -1) break;
iter.assign(G.size(), 0);
while(ret < f_limit) {
T f = dfs(s, t, f_limit - ret);
if (f == 0) break;
ret += f;
}
}
return ret;
}
vector<bool> min_cut(int s) {
vector<bool> used(G.size(), 0);
used[s] = 1;
queue<int> que;
que.push(s);
while(!que.empty()) {
int v = que.front();
que.pop();
for (edge &e : G[v]) {
if (e.cap > 0 && !used[e.to]) {
used[e.to] = 1;
que.push(e.to);
}
}
}
return used;
}
};
int main() {
int n, m, s, t;
cin >> n >> m >> s >> t;
--s, --t;
MaxFlow<ll> mf(n);
rep(i,0,m) {
int u, v, c;
cin >> u >> v >> c;
--u, --v;
mf.add_edge(u, v, c);
}
cout << mf.flow(s, t) << endl;
return 0;
}