이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<vector<int>> adj(n);
vector<int> fa(n);
iota(fa.begin(), fa.end(), 0);
auto leader = [&](int x) {
while (x != fa[x]) x = fa[x] = fa[fa[x]];
return x;
};
auto unite = [&](int x, int y) -> bool {
x = leader(x), y = leader(y);
return (x != y) && (fa[y] = x, true);
};
bool yay = true;
for (int i = 0; i < m; ++i) {
int x, y;
cin >> x >> y;
x -= 1, y -= 1;
adj[x].push_back(y);
adj[y].push_back(x);
yay &= unite(x, y);
}
if (yay) {
vector<int> down(n), up(n), parent(n, -1);
auto dfs = [&](auto self, int v) -> void {
for (int to: adj[v]) {
if (to != parent[v]) {
parent[to] = v;
self(self, to);
down[v] = max(down[v], down[to] + 1);
}
}
};
dfs(dfs, 0);
auto gfs = [&](auto self, int v) -> void {
vector<int> nxt(adj[v]);
auto it = find(nxt.begin(), nxt.end(), parent[v]);
if (it != nxt.end()) {
nxt.erase(it);
}
int s = size(nxt);
vector<int> pref(s + 1), suf(s + 1);
for (int i = 0; i < s; ++i) {
int to = nxt[i];
pref[i + 1] = max(pref[i], down[to]);
}
for (int i = s - 1; i >= 0; --i) {
int to = nxt[i];
suf[i] = max(suf[i + 1], down[to]);
up[to] = max(pref[i], suf[i + 1]);
self(self, to);
}
};
gfs(gfs, 0);
for (int i = 0; i < n && yay; ++i) {
int cnt = up[i] > 2;
for (int to: adj[i]) {
if (to != parent[i]) {
cnt += down[to] > 1;
}
}
yay &= cnt <= 3;
}
}
if (yay) {
cout << "YES\n";
cout << "1\n1\n";
} else {
cout << "NO\n";
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |