QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#187295#3855. Regional developmentRiverHamster#TL 0ms0kbC++172.1kb2023-09-24 16:09:202023-09-24 16:09:21

Judging History

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

  • [2023-09-24 16:09:21]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2023-09-24 16:09:20]
  • 提交

answer

// #include <bits/stdc++.h>
// #include <unistd.h>
#include <cstdio>
#include <vector>
#include <cstring>
#include <array>
using namespace std;

using ll = long long;
#define LOG(f...) fprintf(stderr, f)

const int N = 1005;
int odeg[N];

const int Node = 1007, Edge = 12010;

struct edge {
  int v, f, nt;
} e[Edge * 2];
int hd[Node], ec = 0, cur[Node];
int h[Node];
int S, T;

void link(int u, int v, int f) {
  e[ec] = {v, f, hd[u]}; hd[u] = ec++;
  e[ec] = {u, 0, hd[v]}; hd[v] = ec++;
}

bool BFS() {
  static int q[Node];
  int ql = -1, qr = -1;
  q[++qr] = S; h[S] = 0;
  memset(h, 0x3f, sizeof(h));
  while (ql != qr) {
    int u = q[++ql];
    for (int i = hd[u]; ~i; i = e[i].nt)
      if (e[i].f && h[e[i].v] == 0x3f3f3f3f)
        h[e[i].v] = h[u] + 1, q[++qr] = e[i].v;
  }
  return h[T] != 0x3f3f3f3f;
}

int DFS(int u, int fl) {
  if (u == T) return fl;
  int ans = 0;
  for (int &i = cur[u]; ~i; i = e[i].nt) {
    if (h[e[i].v] == h[u] + 1 && e[i].f) {
      int aug = min(fl, e[i].f);
      aug = DFS(e[i].v, aug);
      e[i].f -= aug; e[i ^ 1].f += aug;
      fl -= aug; ans += aug;
      if (!fl) return ans;
    }
  }
  if (!ans) h[u] = 0x3f3f3f3f;
  return ans;
}

int maxflow() {
  int ans = 0;
  while (BFS()) {
    memcpy(cur, hd, sizeof(hd));
    ans += DFS(S, 0x3f3f3f3f);
  }
  return ans;
}

int main() {
  // freopen("input.txt", "r", stdin);
  // freopen("output.txt", "w", stdout);
  memset(hd, -1, sizeof(hd));
  int n, m, M;
  scanf("%d%d%d", &n, &m, &M);
  vector<array<int, 4>> E;
  for (int i = 0; i < m; ++i) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    E.push_back({u, v, w});
    odeg[u] += w; odeg[v] -= w;
  }
  S = n + 1; T = n + 2;
  int req = 0;
  for (int i = 1; i <= n; ++i)
    if (odeg[i] > 0) link(S, i, odeg[i] / M), req += odeg[i] / M;
    else if (odeg[i] < 0) link(i, T, -odeg[i] / M);
  for (auto &e : E)
    link(e[0], e[1], 1), e[3] = ec - 1;
  int f = maxflow();
  if (f != req) puts("IMPOSSIBLE");
  else {
    for (auto _e : E)
      if (e[_e[3]].f) printf("%d\n", _e[2] - M);
      else printf("%d\n", _e[2]);
  }
}

詳細信息

Test #1:

score: 0
Time Limit Exceeded

input:

10 23 3
2 10 1
2 6 1
6 9 1
7 9 1
6 7 1
3 6 1
1 3 1
1 6 2
6 10 1
2 9 1
4 9 2
4 7 2
3 10 2
3 9 1
6 8 1
7 8 2
3 5 1
5 9 1
8 9 2
3 8 2
1 5 2
1 4 1
5 10 2

output:


result: