結果
問題 | No.241 出席番号(1) |
ユーザー |
![]() |
提出日時 | 2017-06-29 16:37:17 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 1,432 bytes |
コンパイル時間 | 1,461 ms |
コンパイル使用メモリ | 160,616 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-30 21:41:44 |
合計ジャッジ時間 | 2,618 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 29 |
ソースコード
#include <bits/stdc++.h>#define FOR(i,bg,ed) for(ll i=(bg);i<(ed);i++)#define REP(i,n) FOR(i,0,n)#define MOD 1000000007//#define int long longusing namespace std;typedef long long ll;const int INF = 1e9;const int MAX_V = 110;int V;vector<int> G[MAX_V];int match[MAX_V];bool used[MAX_V];//uとvを結ぶ辺をグラフに追加するvoid add_edge(int u, int v){G[u].push_back(v);G[v].push_back(u);}//増加パスをDFSで探すbool dfs(int v){used[v] = true;for (int i=0; i<G[v].size(); i++) {int u = G[v][i], w = match[u];if (w < 0 || !used[w] && dfs(w)) {match[v] = u;match[u] = v;return true;}}return false;}//二部グラフの最大マッチングを求めるint bipartite_matching(){int res = 0;memset(match, -1, sizeof(match));for (int v=0; v<V; v++) {if (match[v] < 0) {memset(used, 0, sizeof(used));if (dfs(v)) {res++;}}}return res;}signed main(){int N;int A;cin >> N;V = N;REP(i,N) {cin >> A;REP(j,N) {if (j != A) {add_edge(i, N + j);}}}if (bipartite_matching() != N) {cout << -1 << endl;} else {REP(i,N) {cout << match[i] - N << endl;}}}