QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#480348#602. 最小费用最大流(随机数据)yzy1#100 ✓1218ms14092kbC++233.0kb2024-07-16 14:26:442024-07-16 14:26:44

Judging History

你现在查看的是最新测评结果

  • [2024-07-16 14:26:44]
  • 评测
  • 测评结果:100
  • 用时:1218ms
  • 内存:14092kb
  • [2024-07-16 14:26:44]
  • 提交

answer

#if defined(LOCAL)
#define _GLIBCXX_DEBUG
#else
#define NDEBUG
#endif

#include <bits/stdc++.h>

#if defined(LOCAL)
#define DBG_MACRO_NO_WARNING
#include <dbg.hpp>
#else
#define dbg(x...) (0)
#endif

using namespace std;

using ll = long long;

// #define int ll
#define rep(i, f, t) for (int i = (f), ed##i = (t); i <= ed##i; ++i)
#define re(i, t) rep (i, 1, t)
#define per(i, t, f) for (int i = (t), ed##i = (f); i >= ed##i; --i)
#define ste(i, f, t, s) for (int i = (f), ed##i = (t); i <= ed##i; i += s)
#define nxt(i, f, g) for (int i = g.h[f]; i; i = g.e[i].n)
#define umod(x) ((x) >= mo && ((x) -= mo))
#define dmod(x) ((x) < 0 && ((x) += mo))
#define y1 y1__
#define fio(x) (freopen(x ".in", "r", stdin), freopen(x ".out", "w", stdout))

template <class T, class E>
__attribute__((always_inline)) inline void up(T &x, E &&y) {
  if (x < y) x = y;
}
template <class T, class E>
__attribute__((always_inline)) inline void down(T &x, E &&y) {
  if (y < x) x = y;
}

const int N = 1e6 + 9;
const ll inf = 0x3f3f3f3f3f3f3f3fll;

struct G {
  int tot = 1, h[N];
  struct E {
    int t, n;
    ll ca, fl, co;
  } e[N << 1];
  inline void Add(int f, int t, ll ca, ll fl, ll co) {
    e[++tot] = {t, h[f], ca, fl, co}, h[f] = tot;
  }
} g;

inline void Add(int f, int t, ll fl, ll co) {
  g.Add(f, t, fl, 0, co);
  g.Add(t, f, 0, 0, -co);
}

int cur[N];
ll dis[N];
bool vis[N];

inline bool Bfs(int S, int T, int n) {
  re (i, n) dis[i] = 0x3f3f3f3f3f3f3f3fll, vis[i] = 0;
  queue<int> q;
  q.push(S);
  vis[S] = 1;
  dis[S] = 0;
  while (q.size()) {
    int f = q.front();
    q.pop();
    vis[f] = 0;
    nxt (i, f, g) {
      if (g.e[i].fl >= g.e[i].ca) continue;
      int t = g.e[i].t;
      ll co = g.e[i].co;
      if (dis[f] + co < dis[t]) {
        dis[t] = dis[f] + co;
        if (!vis[t]) q.push(t);
      }
    }
  }
  return dis[T] < inf;
}

inline pair<ll, ll> Dfs(int f, ll fl, int T) {
  if (!fl || f == T) return {fl, 0};
  ll ou = 0, co = 0;
  vis[f] = 1;
  for (int &i = cur[f]; i; i = g.e[i].n) {
    int t = g.e[i].t;
    pair<ll, ll> tmp;
    if (!vis[t] && dis[t] == dis[f] + g.e[i].co &&
        (tmp = Dfs(t, min(fl, g.e[i].ca - g.e[i].fl), T)).first) {
      fl -= tmp.first, ou += tmp.first, g.e[i].fl += tmp.first, g.e[i ^ 1].fl -= tmp.first;
      co += tmp.second + tmp.first * g.e[i].co;
    }
  }
  if (!ou) dis[f] = inf;
  vis[f] = 0;
  return {ou, co};
}

inline pair<ll, ll> Dinic(int S, int T, int n) {
  ll fl = 0, co = 0;
  while (1) {
    if (!Bfs(S, T, n)) break;
    // cerr << "BFS!\n";
    re (i, n) cur[i] = g.h[i];
    auto tmp = Dfs(S, inf, T);
    fl += tmp.first, co += tmp.second;
  }
  return {fl, co};
}

int n, m, S, T;

signed main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  S = 1, T = n;
  re (i, m) {
    int f, t;
    ll fl, co;
    cin >> f >> t >> fl >> co;
    Add(f, t, fl, co);
  }
  auto [fl, co] = Dinic(S, T, n);
  cout << fl << ' ' << co << '\n';
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 10
Accepted
time: 1ms
memory: 9952kb

input:

8 27
2 3 2147483647 100
1 3 1 100
2 4 2147483647 10
1 4 1 10
2 4 2147483647 10
1 4 1 10
2 8 3 0
3 5 2147483647 100
1 5 1 100
3 8 1 0
3 2 2147483647 0
4 5 2147483647 10
1 5 1 10
4 8 1 0
4 2 2147483647 0
5 6 2147483647 1
1 6 1 1
5 6 2147483647 1
1 6 1 1
5 7 2147483647 1
1 7 1 1
5 8 3 0
5 2 2147483647 ...

output:

8 243

result:

ok 2 number(s): "8 243"

Test #2:

score: 10
Accepted
time: 1ms
memory: 9916kb

input:

12 49
2 10 2147483647 5
1 10 1 5
2 5 2147483647 50
1 5 1 50
2 9 2147483647 8
1 9 1 8
2 8 2147483647 47
1 8 1 47
2 11 2147483647 17
1 11 1 17
2 12 5 0
3 12 0 0
3 2 2147483647 0
4 6 2147483647 18
1 6 1 18
4 11 2147483647 12
1 11 1 12
4 9 2147483647 14
1 9 1 14
4 12 3 0
4 2 2147483647 0
5 11 2147483647...

output:

15 436

result:

ok 2 number(s): "15 436"

Test #3:

score: 10
Accepted
time: 1ms
memory: 9984kb

input:

27 169
2 15 2147483647 24
1 15 1 24
2 19 2147483647 96
1 19 1 96
2 12 2147483647 49
1 12 1 49
2 13 2147483647 75
1 13 1 75
2 24 2147483647 2
1 24 1 2
2 27 5 0
3 27 0 0
3 2 2147483647 0
4 11 2147483647 99
1 11 1 99
4 3 2147483647 85
1 3 1 85
4 27 2 0
4 2 2147483647 0
5 27 0 0
5 2 2147483647 0
6 9 214...

output:

60 4338

result:

ok 2 number(s): "60 4338"

Test #4:

score: 10
Accepted
time: 34ms
memory: 9756kb

input:

77 2149
2 42 2147483647 33
1 42 1 33
2 68 2147483647 30
1 68 1 30
2 76 2147483647 13
1 76 1 13
2 51 2147483647 93
1 51 1 93
2 12 2147483647 39
1 12 1 39
2 57 2147483647 74
1 57 1 74
2 70 2147483647 21
1 70 1 21
2 73 2147483647 24
1 73 1 24
2 52 2147483647 54
1 52 1 54
2 15 2147483647 99
1 15 1 99
2 ...

output:

1000 74606

result:

ok 2 number(s): "1000 74606"

Test #5:

score: 10
Accepted
time: 167ms
memory: 9704kb

input:

102 4199
2 48 2147483647 42
1 48 1 42
2 85 2147483647 50
1 85 1 50
2 22 2147483647 83
1 22 1 83
2 95 2147483647 97
1 95 1 97
2 82 2147483647 34
1 82 1 34
2 25 2147483647 72
1 25 1 72
2 4 2147483647 17
1 4 1 17
2 47 2147483647 10
1 47 1 10
2 71 2147483647 12
1 71 1 12
2 68 2147483647 39
1 68 1 39
2 2...

output:

2000 161420

result:

ok 2 number(s): "2000 161420"

Test #6:

score: 10
Accepted
time: 161ms
memory: 9696kb

input:

102 4199
2 79 2147483647 13
1 79 1 13
2 83 2147483647 73
1 83 1 73
2 75 2147483647 90
1 75 1 90
2 30 2147483647 92
1 30 1 92
2 54 2147483647 25
1 54 1 25
2 66 2147483647 53
1 66 1 53
2 52 2147483647 37
1 52 1 37
2 63 2147483647 46
1 63 1 46
2 11 2147483647 20
1 11 1 20
2 55 2147483647 53
1 55 1 53
2...

output:

2000 143072

result:

ok 2 number(s): "2000 143072"

Test #7:

score: 10
Accepted
time: 156ms
memory: 11836kb

input:

102 4199
2 39 2147483647 45
1 39 1 45
2 51 2147483647 11
1 51 1 11
2 86 2147483647 63
1 86 1 63
2 23 2147483647 46
1 23 1 46
2 48 2147483647 63
1 48 1 63
2 87 2147483647 8
1 87 1 8
2 73 2147483647 63
1 73 1 63
2 5 2147483647 52
1 5 1 52
2 80 2147483647 21
1 80 1 21
2 31 2147483647 44
1 31 1 44
2 101...

output:

2000 146132

result:

ok 2 number(s): "2000 146132"

Test #8:

score: 10
Accepted
time: 1052ms
memory: 14092kb

input:

302 10599
2 72 2147483647 169
1 72 1 169
2 260 2147483647 165
1 260 1 165
2 12 2147483647 108
1 12 1 108
2 16 2147483647 26
1 16 1 26
2 28 2147483647 148
1 28 1 148
2 7 2147483647 74
1 7 1 74
2 139 2147483647 199
1 139 1 199
2 231 2147483647 9
1 231 1 9
2 287 2147483647 123
1 287 1 123
2 135 2147483...

output:

5000 1106316

result:

ok 2 number(s): "5000 1106316"

Test #9:

score: 10
Accepted
time: 1218ms
memory: 13736kb

input:

302 10599
2 222 2147483647 132
1 222 1 132
2 17 2147483647 7
1 17 1 7
2 177 2147483647 253
1 177 1 253
2 90 2147483647 195
1 90 1 195
2 128 2147483647 289
1 128 1 289
2 42 2147483647 193
1 42 1 193
2 213 2147483647 133
1 213 1 133
2 263 2147483647 293
1 263 1 293
2 50 2147483647 155
1 50 1 155
2 228...

output:

5000 1290871

result:

ok 2 number(s): "5000 1290871"

Test #10:

score: 10
Accepted
time: 1141ms
memory: 13852kb

input:

302 10599
2 176 2147483647 289
1 176 1 289
2 190 2147483647 99
1 190 1 99
2 10 2147483647 96
1 10 1 96
2 240 2147483647 165
1 240 1 165
2 273 2147483647 205
1 273 1 205
2 248 2147483647 194
1 248 1 194
2 220 2147483647 122
1 220 1 122
2 194 2147483647 167
1 194 1 167
2 8 2147483647 67
1 8 1 67
2 227...

output:

5000 1395897

result:

ok 2 number(s): "5000 1395897"