結果
| 問題 |
No.241 出席番号(1)
|
| コンテスト | |
| ユーザー |
kurenai3110
|
| 提出日時 | 2017-06-02 00:26:06 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 2,000 ms |
| コード長 | 2,489 bytes |
| コンパイル時間 | 934 ms |
| コンパイル使用メモリ | 79,396 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-30 21:41:07 |
| 合計ジャッジ時間 | 2,160 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 29 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
using namespace std;
struct Dinic {
static const int INF = 1e9;
struct E {
//to,容量,逆辺のindex
int to, cap, rev;
E(int t, int c, int r) {
to = t;
cap = c;
rev = r;
}
};
//最大頂点数
int MAX_V;
vector<vector<E>>G;
Dinic(int max_v) {
MAX_V = max_v;
G.resize(MAX_V);
}
//有向辺
inline void add_edge(int from, int to, int cap) {
if (from == to)return;
G[from].push_back(E(to, cap, G[to].size()));
G[to].push_back(E(from, 0, G[from].size()-1));
}
//無向辺
inline void add_undirected_edge(int from, int to, int cap) {
if (from == to)return;
G[from].push_back(E(to, cap, G[to].size()));
G[to].push_back(E(from, cap, G[from].size()-1));
}
//深さ
vector<int>level;
//深さのラベル付け
void bfs(int s) {
level.assign(MAX_V, -1);
queue<int> 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++) {
E &e = G[v][i];
if (e.cap > 0 && level[e.to] < 0) {
level[e.to] = level[v] + 1;
que.push(e.to);
}
}
}
}
//s -- v -- u -- t
//tから深さ優先探索
int dfs(int s, int u, int crr) {
if (s == u || crr == 0)return crr;
int sum = 0;
for (int i = 0; i < G[u].size(); i++) {
E& e = G[u][i]; //t側
E& ee = G[e.to][e.rev]; //s側
int v = e.to;
if (level[v] >= level[u] || ee.cap <= 0)continue;
int f = dfs(s, v, min(crr - sum, ee.cap));
if (f <= 0)continue;
//容量の更新
ee.cap -= f;
e.cap += f;
//流量の更新
sum += f;
if (sum == crr)break;
}
return sum;
}
int max_flow(int s, int t) {
int flow = 0;
//tに流せなくなるまで
while(1){
bfs(s);
if (level[t] < 0)return flow;
flow += dfs(s, t, INF);
}
}
};
int main()
{
int N; cin >> N;
vector<int>A(N);
for (int i = 0; i < N; i++) {
cin >> A[i];
}
Dinic dnc(2502);
for (int i = 0; i < N; i++) {
dnc.add_edge(0,i+1,1);
for (int j = 0; j < N; j++) {
if (j == A[i])continue;
dnc.add_edge(i + 1, N + j + 1, 1);
}
dnc.add_edge(N + i + 1, N*N + 1, 1);
}
int ans = dnc.max_flow(0,N*N+1);
if (ans != N)cout << -1 << endl;
else {
for (int i = 1; i <= N; i++) {
for (int j = 0; j < dnc.G[i].size(); j++) {
if (dnc.G[i][j].to > i && dnc.G[i][j].cap == 0)cout << dnc.G[i][j].to - N - 1<< endl;
}
}
}
return 0;
}
kurenai3110