提出 #33655383


ソースコード 拡げる

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

typedef long long ll;
#define rep(i,a,n) for (ll i=a;i<(ll)n;i++)
#define per(i,a,n) for (ll i=n;i-->(ll)a;)
#define pb push_back

ll read(){ll r;scanf("%lld",&r);return r;} // read

int main() {
  int N = read();
  int M = read();
  int K = read();
  vector<int> A(M), B(M);
  atcoder::scc_graph graph(N); // 0-index 点
  rep(i,0,M){
    A[i] = read() - 1; // 0-index
    B[i] = read() - 1;
    graph.add_edge(A[i], B[i]);
  }
  const vector<vector<int>> scc = graph.scc(); // 连通块
  const int V = scc.size(); // DAG节点个数
  vector<int> belongs(N); // [节点] = 所在块
  rep(i,0,V) for(int u : scc[i]) belongs[u] = i;
  vector<ll> X(V); // 新图每个点上的 值
  rep(i,0,N){
    int x = read();
    X[belongs[i]] += x;
  }
  vector<ll> accum(V + 1, 0); // 前缀和
  rep(i,0,V) accum[i + 1] = accum[i] + X[i];

  atcoder::mcf_graph<int, ll> network(2 * V + 1); // in[1]变成 S
  int S = 2*belongs[0];
  int T = 2*V;
  rep(i,0,V) {
    network.add_edge(2 * i, 2 * i + 1, 1, 0); // in[i] -> out[i], 容量1, 费用 -X[i] + X[i]
    network.add_edge(2 * i, 2 * i + 1, K, X[i]); // in[i] -> out[i], 容量K(无穷), 费用 0 + X[i]
    network.add_edge(2 * i + 1, 2 * V, K, accum[V] - accum[i + 1]); // out[i] -> T 费用 0 + All - X[0..i]
  }
  rep(i,0,M) {
    int u = belongs[A[i]];
    int v = belongs[B[i]];
    // assert(accum[v] - accum[u + 1]); 保证不了啊 如果是拓扑则可以
    if (u != v) network.add_edge(2 * u + 1, 2 * v, K, accum[v] - accum[u + 1]); // out[u] -> in[v] , 容量k, 费用 0 + X[0..v] - X[0..u]
  }
  auto [maxflow, mincost] = network.flow(S,T,K);
  printf("%lld\n",(accum[V] - accum[belongs[0]]) * K - mincost);
}

提出情報

提出日時
問題 H - Collecting
ユーザ cromarmot
言語 C++ (GCC 9.2.1)
得点 600
コード長 1774 Byte
結果 AC
実行時間 256 ms
メモリ 164236 KiB

コンパイルエラー

./Main.cpp: In function ‘ll read()’:
./Main.cpp:11:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   11 | ll read(){ll r;scanf("%lld",&r);return r;} // read
      |                ~~~~~^~~~~~~~~~~

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 2
AC × 37
セット名 テストケース
Sample example_00.txt, example_01.txt
All chain_00.txt, chain_01.txt, chain_02.txt, chain_03.txt, chain_04.txt, chain_05.txt, chain_06.txt, chain_07.txt, chain_08.txt, chain_09.txt, dense_00.txt, dense_01.txt, dense_02.txt, dense_03.txt, dense_04.txt, dense_05.txt, dense_06.txt, dense_07.txt, dense_08.txt, dense_09.txt, example_00.txt, example_01.txt, handmade_00.txt, handmade_01.txt, handmade_02.txt, line_00.txt, line_01.txt, random_00.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt
ケース名 結果 実行時間 メモリ
chain_00.txt AC 233 ms 147080 KiB
chain_01.txt AC 256 ms 140148 KiB
chain_02.txt AC 213 ms 141412 KiB
chain_03.txt AC 244 ms 139972 KiB
chain_04.txt AC 237 ms 150960 KiB
chain_05.txt AC 175 ms 112348 KiB
chain_06.txt AC 232 ms 140756 KiB
chain_07.txt AC 240 ms 144148 KiB
chain_08.txt AC 213 ms 141596 KiB
chain_09.txt AC 242 ms 141888 KiB
dense_00.txt AC 73 ms 30136 KiB
dense_01.txt AC 90 ms 31324 KiB
dense_02.txt AC 88 ms 30844 KiB
dense_03.txt AC 67 ms 28972 KiB
dense_04.txt AC 95 ms 33436 KiB
dense_05.txt AC 64 ms 22868 KiB
dense_06.txt AC 78 ms 31488 KiB
dense_07.txt AC 66 ms 22716 KiB
dense_08.txt AC 72 ms 25444 KiB
dense_09.txt AC 77 ms 26936 KiB
example_00.txt AC 2 ms 3740 KiB
example_01.txt AC 2 ms 3784 KiB
handmade_00.txt AC 2 ms 3784 KiB
handmade_01.txt AC 63 ms 35756 KiB
handmade_02.txt AC 57 ms 34328 KiB
line_00.txt AC 240 ms 164236 KiB
line_01.txt AC 242 ms 164072 KiB
random_00.txt AC 234 ms 139176 KiB
random_01.txt AC 235 ms 139048 KiB
random_02.txt AC 35 ms 6348 KiB
random_03.txt AC 38 ms 6472 KiB
random_04.txt AC 32 ms 5936 KiB
random_05.txt AC 39 ms 7124 KiB
random_06.txt AC 102 ms 66168 KiB
random_07.txt AC 186 ms 114940 KiB
random_08.txt AC 86 ms 33660 KiB
random_09.txt AC 183 ms 114320 KiB