https://www.acmicpc.net/problem/14675
๋ฌธ์
๊ทธ๋ํ ์ด๋ก ์์ ๋จ์ ์ (cut vertex)๊ณผ ๋จ์ ์ (bridge)์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ ๋๋ค.
- ๋จ์ ์ (cut vertex) : ํด๋น ์ ์ ์ ์ ๊ฑฐํ์์ ๋, ๊ทธ ์ ์ ์ด ํฌํจ๋ ๊ทธ๋ํ๊ฐ 2๊ฐ ์ด์์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ, ์ด ์ ์ ์ ๋จ์ ์ ์ด๋ผ ํ๋ค.
- ๋จ์ ์ (bridge) : ํด๋น ๊ฐ์ ์ ์ ๊ฑฐํ์์ ๋, ๊ทธ ๊ฐ์ ์ด ํฌํจ๋ ๊ทธ๋ํ๊ฐ 2๊ฐ ์ด์์ผ๋ก ๋๋๋ ๊ฒฝ์ฐ, ์ด ๊ฐ์ ์ ๋จ์ ์ ์ด๋ผ ํ๋ค.
์ด ๋จ์ ์ ๊ณผ ๋จ์ ์ ์ ์ฐ๋ฆฌ๋ ํธ๋ฆฌ(tree)์์ ๊ตฌํ๋ ค๊ณ ํ๋ค. ๊ทธ๋ํ ์ด๋ก ์์ ํธ๋ฆฌ(tree)์ ์ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ํธ๋ฆฌ(tree) : ์ฌ์ดํด์ด ์กด์ฌํ์ง ์์ผ๋ฉฐ, ๋ชจ๋ ์ ์ ์ด ์ฐ๊ฒฐ๋์ด ์๋ ๊ทธ๋ํ
ํธ๋ฆฌ์ ์ ๋ณด์ ์ง์๊ฐ ์ฃผ์ด์ง ๋, ์ง์์ ๋ํ ๋ต์ ํ์์ค.
์ ๋ ฅ
ํ๋ก๊ทธ๋จ์ ์ ๋ ฅ์ ํ์ค ์ ๋ ฅ์ผ๋ก ๋ฐ๋๋ค. ์ ๋ ฅ์ ์ฒซ ์ค์๋ ํธ๋ฆฌ์ ์ ์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. (2 ≤ N ≤ 100,000) ํธ๋ฆฌ์ ์ ์ ์ 1๋ฒ๋ถํฐ n๋ฒ๊น์ง ์กด์ฌํ๋ค. ๋ค์ ์ค๋ถํฐ N-1๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ์ ์ ์ ๋ณด a, b๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ a์ ์ ๊ณผ b์ ์ ์ด ์ฐ๊ฒฐ๋์ด ์๋ค๋ ๋ป์ด๋ฉฐ, ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ์ ๋ณด๋ ํธ๋ฆฌ์์ด ๋ณด์ฅ๋๋ค. (1 ≤ a, b ≤ N)
๋ค์ ์ค์๋ ์ง์์ ๊ฐ์ q๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ q ≤ 100,000) ๋ค์ q์ค์๋ ์ง์ t k๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ t ≤ 2) t๊ฐ 1์ผ ๋๋ k๋ฒ ์ ์ ์ด ๋จ์ ์ ์ธ์ง์ ๋ํ ์ง์, t๊ฐ 2์ผ ๋๋ ์ ๋ ฅ์์ ์ฃผ์ด์ง๋ k๋ฒ์งธ ๊ฐ์ ์ด ๋จ์ ์ ์ธ์ง์ ๋ํ ์ง์์ด๋ค. t๊ฐ 1์ผ ๋๋ (1 ≤ k ≤ n)์ด๋ฉฐ, t๊ฐ 2์ผ ๋๋ (1 ≤ k ≤ n - 1)์ด๋ค.
์ถ๋ ฅ
ํ๋ก๊ทธ๋จ์ ์ถ๋ ฅ์ ํ์ค ์ถ๋ ฅ์ผ๋ก ํ๋ค. q์ค์ ๋ํ์ฌ ํด๋น ์ง์์ ๋ํ ๋ต์ ํ๋ค. ๊ฐ๊ฐ์ ๊ฐํ์ผ๋ก ๊ตฌ๋ถํ๋ฉฐ, ์ง์๊ฐ ๋ง๋ค๋ฉด ‘yes’๋ฅผ, ์ง์๊ฐ ํ๋ฆฌ๋ฉด ‘no’๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ด
๋จ์ ์ ...? ๋จ์ ์ ...? ๊ฝค๋ ์ฅํฉํ๊ณ ๊ธธ๊ฒ ์ค๋ช ํ๊ณ ์์ง๋ง !
๊ฒฐ๊ตญ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋ ํธ๋ฆฌ๋ ๋ชจ๋ ์ ์ด ๋จ์ ์ ์ด๊ณ , ๋งจ ๋ง์ง๋ง ๋ ธ๋๋ฅผ ์ ์ธํ ๋ชจ๋ ์ ์ด ๋จ์ ์ ์ด๋ค
// Authored by : seondal
// Co-authored by : -
// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
using namespace std;
bool isArtPoint(int k, vector<vector<int>>&graph) {
// ํธ๋ฆฌ๋ ์ฌ์ดํด์ด ์์ผ๋ฏ๋ก ๋งจ ๋์ ์ ์ ์ธํ ๋ชจ๋ ์ ์ ์ด ๋จ์ ์
if(graph[k].size() >= 2)
// ์ธ์ ๊ทธ๋ํ์์ graph[k].size = ์ฐ๊ฒฐ๋ ์ ์ ์ ๊ฐฏ์
// ์ฐ๊ฒฐ๋ ์ ์ ์ ๊ฐฏ์๊ฐ 2๊ฐ ์ด์์ด๋ผ๋ฉด ํด๋น ์ ์ ์ ์์ ๋ ์ฐ๊ฒฐ๋ ์ ์ ๋งํผ ๊ทธ๋ํ๊ฐ ์๊ธด๋ค !
return true;
return false;
}
bool isArtBridge() {
// ํธ๋ฆฌ๋ ์ฌ์ดํด์ด ์์ผ๋ฏ๋ก ๋ชจ๋ ๊ฐ์ ์ด ๋จ์ ์
return true;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int n, a,b, q, t,k;
cin >> n;
vector<vector<int>> graph(n+1);
while(--n) { // ์ธ์ ๊ทธ๋ํ ๋ง๋ค๊ธฐ
cin >> a >> b;
graph[a].push_back(b);
graph[b].push_back(a);
}
cin >> q;
bool ans;
while(q--) {
cin >> t >> k;
if(t==1)
ans = isArtPoint(k, graph);
else // t==2
ans = isArtBridge();
if(ans)
cout << "yes\n";
else
cout << "no\n";
}
return 0;
}
/*
*/
'๐๏ธ ICPC Sinchon > Tree' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 4803๋ฒ: ํธ๋ฆฌ (0) | 2022.11.20 |
---|---|
๋ฐฑ์ค 1991๋ฒ: ํธ๋ฆฌ ์ํ (0) | 2022.11.20 |