๐Ÿ•๏ธ ICPC Sinchon/Tree

[BOJ S1][C++] ๋ฐฑ์ค€ 14675๋ฒˆ: ๋‹จ์ ˆ์ ๊ณผ ๋‹จ์ ˆ์„ 

์„ ๋‹ฌ 2022. 11. 20. 22:00
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/14675

 

14675๋ฒˆ: ๋‹จ์ ˆ์ ๊ณผ ๋‹จ์ ˆ์„ 

ํ”„๋กœ๊ทธ๋žจ์˜ ์ž…๋ ฅ์€ ํ‘œ์ค€ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š”๋‹ค. ์ž…๋ ฅ์˜ ์ฒซ ์ค„์—๋Š” ํŠธ๋ฆฌ์˜ ์ •์  ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (2 ≤ N ≤ 100,000) ํŠธ๋ฆฌ์˜ ์ •์ ์€ 1๋ฒˆ๋ถ€ํ„ฐ n๋ฒˆ๊นŒ์ง€ ์กด์žฌํ•œ๋‹ค. ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ N-1๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๊ฐ„์„ ์˜ ์ •

www.acmicpc.net

 

๋ฌธ์ œ

๊ทธ๋ž˜ํ”„ ์ด๋ก ์—์„œ ๋‹จ์ ˆ์ (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