結果
問題 | No.241 出席番号(1) |
ユーザー |
![]() |
提出日時 | 2018-10-31 17:28:37 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 1,444 bytes |
コンパイル時間 | 1,918 ms |
コンパイル使用メモリ | 199,028 KB |
最終ジャッジ日時 | 2025-01-06 15:14:26 |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 29 |
ソースコード
#include <bits/stdc++.h>using namespace std;using i64 = int64_t;using vi = vector<i64>;using vvi = vector<vi>;class BipartiteMatching {int n;vvi adj;vi mc;vi used;bool dfs(int v) {used[v] = true;for (int i = 0; i < adj[v].size(); i++) {int u = adj[v][i];int w = mc[u];if (w < 0 || (!used[w] && dfs(w))) {mc[v] = u;mc[u] = v;return true;}}return false;}public:BipartiteMatching(int n) : n(n), adj(n), mc(n, -1) {}void addEdge(int u, int v) {adj[u].push_back(v);adj[v].push_back(u);}int match() {int ret = 0;for (int v = 0; v < n; v++) {if (mc[v] < 0) {used = vi(n);if (dfs(v)) {ret++;}}}return ret;}int operator[](int k) {return mc[k];}};int main() {int n;cin >> n;BipartiteMatching match(n + 50);for (int i = 0; i < n; i++) {int a;cin >> a;for (int j = 0; j < n; j++) {if (a == j) continue;match.addEdge(i, n + j);}}if (match.match() != n) {cout << -1 << endl;return 0;}for (int i = 0; i < n; i++) {cout << match[i] - n << endl;}}