# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
467355 | phathnv | Pastiri (COI20_pastiri) | C++98 | 1070 ms | 86324 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int N = 500007;
int n, k, sheep[N], h[N], d[N], trace[N], numNode;
pair<int, int> best[2 * N];
vector<int> adj[N], child[2 * N];
bool vst[N];
int main() {
scanf("%d %d", &n, &k);
for (int i = 1; i < n; i++) {
int u, v;
scanf("%d %d", &u, &v);
adj[u].push_back(v);
adj[v].push_back(u);
}
for (int i = 1; i <= k; i++)
scanf("%d", &sheep[i]);
queue<int> qu;
h[1] = 1;
qu.push(1);
while (!qu.empty()) {
int u = qu.front();
qu.pop();
for (int v : adj[u])
if (!h[v]) {
h[v] = h[u] + 1;
qu.push(v);
}
}
for (int i = 1; i <= k; i++) {
int x = sheep[i];
++numNode;
trace[x] = numNode;
d[x] = 1;
qu.push(x);
}
while (!qu.empty()) {
int u = qu.front();
qu.pop();
for (int v : adj[u]) {
if (!d[v]) {
trace[v] = trace[u];
d[v] = d[u] + 1;
qu.push(v);
} else if (d[v] == d[u] + 1) {
int newNode = ++numNode;
child[newNode].push_back(trace[u]);
child[newNode].push_back(trace[v]);
trace[v] = newNode;
}
}
}
for (int u = 1; u <= numNode; u++) {
if (u <= k)
best[u] = {h[sheep[u]], 0};
else
best[u] = {1e9, 0};
for (int v : child[u]) {
best[u] = min(best[u], best[v]);
vst[v] = true;
}
best[u].second = u;
}
for (int u = 1; u <= numNode; u++)
if (vst[u]) {
best[u] = {1e9, 1e9};
vst[u] = false;
}
for (int u = numNode; u >= 1; u--) {
for (int v : child[u])
best[v] = min(best[v], best[u]);
}
vector<int> ord(k);
iota(ord.begin(), ord.end(), 1);
sort(ord.begin(), ord.end(), [&](const int &a, const int &b){
return h[sheep[a]] > h[sheep[b]];
});
map<int, int> nodeToVex;
for (int i = 1; i <= n; i++)
nodeToVex[trace[i]] = i;
vector<int> answer;
for (int x : ord) {
if (vst[x])
continue;
queue<int> qu;
qu.push(best[x].second);
answer.push_back(nodeToVex[best[x].second]);
while (!qu.empty()) {
int u = qu.front();
qu.pop();
if (vst[u])
continue;
vst[u] = true;
for (int v : child[u])
qu.push(v);
}
}
printf("%d\n", answer.size());
for (int x : answer)
printf("%d ", x);
}
컴파일 시 표준 에러 (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... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |