結果
問題 | No.2263 Perms |
ユーザー |
![]() |
提出日時 | 2023-04-07 21:47:58 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 7 ms / 2,000 ms |
コード長 | 2,962 bytes |
コンパイル時間 | 2,066 ms |
コンパイル使用メモリ | 184,832 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-10-02 19:20:34 |
合計ジャッジ時間 | 3,680 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 39 |
ソースコード
#include <bits/stdc++.h>using namespace std;const int INF = 1000000;template <typename Cap>struct dinic{struct edge{int to, rev;Cap cap;edge(int to, int rev, Cap cap): to(to), rev(rev), cap(cap){}};int N;vector<vector<edge>> G;dinic(){}dinic(int N): N(N), G(N){}void add_edge(int from, int to, Cap cap){G[from].push_back(edge(to, G[to].size(), cap));G[to].push_back(edge(from, G[from].size() - 1, 0));}Cap dfs(vector<int> &d, vector<int> &iter, int v, int t, Cap f){if (v == t){return f;}while (iter[v] < G[v].size()){int w = G[v][iter[v]].to;if (G[v][iter[v]].cap > 0 && d[v] < d[w]){Cap f2 = dfs(d, iter, w, t, min(f, G[v][iter[v]].cap));if (f2 > 0){G[v][iter[v]].cap -= f2;G[w][G[v][iter[v]].rev].cap += f2;return f2;}}iter[v]++;}return 0;}Cap max_flow(int s, int t){Cap flow = 0;while (true){vector<int> d(N, -1);d[s] = 0;queue<int> Q;Q.push(s);while (!Q.empty()){if (d[t] != -1){break;}int v = Q.front();Q.pop();for (auto &e : G[v]){int w = e.to;if (e.cap > 0 && d[w] == -1){d[w] = d[v] + 1;Q.push(w);}}}if (d[t] == -1){break;}vector<int> iter(N, 0);while (true){Cap f = dfs(d, iter, s, t, INF);if (f == 0){break;}flow += f;}}return flow;}};int main(){int N, M;cin >> N >> M;vector<vector<int>> A(N, vector<int>(N));for (int i = 0; i < N; i++){for (int j = 0; j < N; j++){cin >> A[i][j];}}bool ok = true;for (int i = 0; i < N; i++){int S = 0, T = 0;for (int j = 0; j < N; j++){S += A[i][j];T += A[j][i];}if (S != M || T != M){ok = false;}}if (!ok){cout << -1 << endl;} else {for (int i = 0; i < M; i++){dinic<int> G(N * 2 + 2);for (int j = 0; j < N; j++){G.add_edge(N * 2, j, 1);G.add_edge(N + j, N * 2 + 1, 1);}for (int j = 0; j < N; j++){for (int k = 0; k < N; k++){if (A[j][k] > 0){G.add_edge(j, N + k, 1);}}}G.max_flow(N * 2, N * 2 + 1);vector<int> P(N);for (int j = 0; j < N; j++){int cnt = G.G[j].size();for (int k = 0; k < cnt; k++){if (G.G[j][k].cap == 0){int w = G.G[j][k].to;if (w != N * 2){P[j] = w - N;}}}}for (int j = 0; j < N; j++){cout << P[j] + 1;if (j < N - 1){cout << ' ';}}cout << endl;for (int j = 0; j < N; j++){A[j][P[j]]--;}}}}