#include "math.h" #include #include #include #include #include #include #include #include #include #define ifor(i, a, b) for (int i = (a); i < (b); i++) #define rfor(i, a, b) for (int i = (b)-1; i >= (a); i--) #define rep(i, n) for (int i = 0; i < (n); i++) #define rrep(i, n) for (int i = (n)-1; i >= 0; i--) using namespace std; typedef long double ld; typedef long long int lli; typedef complex P; const double eps = 1e-11; int vex[4] = {1, 0, -1, 0}; int vey[4] = {0, 1, 0, -1}; typedef vector Vec; typedef vector vec; typedef vector MAT; typedef vector mat; lli MOD = 1000000007; int INF = 100000000; struct edge { int to, cap, rev; edge(int to, int cap, int rev) { this->to = to; this->cap = cap; this->rev = rev; } }; #define MAX_V 130 vector G[MAX_V]; int level[MAX_V]; int iter[MAX_V]; void add_edge(int from, int to, int cap) { G[from].push_back(edge(to, cap, G[to].size())); G[to].push_back(edge(from, 0, G[from].size() - 1)); } void bfs(int s) { rep(i, MAX_V) level[i] = -1; queue que; level[s] = 0; que.push(s); while (!que.empty()) { int v = que.front(); que.pop(); for (int i = 0; i < G[v].size(); i++) { edge& e = G[v][i]; if (e.cap > 0 && level[e.to] < 0) { level[e.to] = level[v] + 1; que.push(e.to); } } } } int dfs(int v, int t, int f) { if (v == t) return f; for (int& i = iter[v]; i < G[v].size(); i++) { edge& e = G[v][i]; if (e.cap > 0 && level[v] < level[e.to]) { int d = dfs(e.to, t, min(f, e.cap)); if (d > 0) { e.cap -= d; G[e.to][e.rev].cap += d; return d; } } } return 0; } int max_flow(int s, int t) { int flow = 0; while (true) { bfs(s); if (level[t] < 0) return flow; rep(i, MAX_V) { iter[i] = 0; } int f; while ((f = dfs(s, t, INF)) > 0) { flow += f; } } } void solve() { int N; cin >> N; int s = 2 * N + 1; int t = 2 * N + 2; int a; rep(i, N) { cin >> a; rep(j, N) { if (j != a) add_edge(i, j + N, 1); } } rep(i, N) add_edge(s, i, 1); rep(i, N) add_edge(i + N, t, 1); int tmp = max_flow(s, t); //cout << tmp << endl; if (tmp != N) cout << -1 << endl; else { vector ans(N); rep(i, N) { rep(j, G[i].size()) { if (G[i][j].cap == 0) { ans[i] = G[i][j].to; } } } rep(i, N) cout << ans[i] - N << endl; } } int main() { solve(); }