# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
31889 | aome | Bosses (BOI16_bosses) | C++14 | 1500 ms | 2656 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/*input
6
2 6 5
3 4 6 3
2 4 1
4 5 3 1 6
5 2 4 6 3 1
3 2 5 3
4
0
1 1
1 2
1 3
*/
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <utility>
#include <vector>
using namespace std;
#define sp ' '
#define endl '\n'
#define fi first
#define se second
#define mp make_pair
#define N 5005
#define bit(x,y) ((x>>y)&1LL)
#define show(x) cout << (#x) << ": " << x << endl;
#define ii pair<int,int>
ostream& operator << (ostream &os, vector<int>&x) {
for (int i = 0; i < x.size(); i++) os << x[i] << sp;
return os;
}
ostream& operator << (ostream &os, pair<int, int> x) {
cout << x.fi << sp << x.se << sp;
return os;
}
ostream& operator << (ostream &os, vector<pair<int, int> >&x) {
for (int i = 0; i < x.size(); i++) os << x[i] << endl;
return os;
}
int n;
vector<vector<int> > g(N);
vector<vector<int> > a(N);
bool visited[N];
int curans = 0;
int dfs(int u, int p) {
int ret = 0;
for (auto v : a[u]) {
if (v == p) continue;
ret += dfs(v, u);
}
curans += ret + 1;
return ret + 1;
}
int cal(int root) {
a.assign(N, vector<int>());
memset(visited, 0, sizeof(visited));
queue<int> q;
q.push(root); visited[root] = true;
while (!q.empty()) {
int u = q.front(); q.pop();
for (auto v : g[u]) {
if (visited[v]) continue;
a[u].push_back(v);
q.push(v); visited[v] = true;
}
}
for (int i = 1; i <= n; i++) if (!visited[i]) return -1;
curans = 0;
dfs(root, root);
return curans;
}
signed main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
int k; scanf("%d", &k);
while (k--) {
int x; scanf("%d", &x);
g[x].push_back(i);
}
}
int ans = -1;
for (int i = 1; i <= n; i++) {
int rec = cal(i); if (rec == -1) continue;
if (ans == -1) ans = rec;
else ans = min(ans, rec);
}
cout << ans << endl;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |