Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 15900번 - λ‚˜λ¬΄ νƒˆμΆœ

dkswnkk 2022. 8. 15. 23:38

문제

 

15900번: λ‚˜λ¬΄ νƒˆμΆœ

ν‰μ†Œμ— 사이가 μ’‹μ§€ μ•Šλ˜ 성원이와 ν˜•μ„μ΄κ°€ λ“œλ””μ–΄ μ œλŒ€λ‘œ ν•œ 판 λΆ™μœΌλ €κ³  ν•œλ‹€. 성원이와 ν˜•μ„μ΄ λ‘˜κ³Ό λͺ¨λ‘ λ˜‘κ°™μ΄ μΉœν•œ 인섭이가 λŒ€κ²° μ’…λͺ©μ„ μ •ν•΄ κ°€μ Έμ™”λ‹€. λ°”λ‘œ 'λ‚˜λ¬΄ νƒˆμΆœ' μ΄λΌλŠ” λ³΄λ“œκ²Œ

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
#include <vector>

using namespace std;

int N;
vector<int>graph[500001];
bool visited[500001];
int odd_height_cnt;

void dfs(int node, int depth){
    if(graph[node].size()==1 && node != 1){  // λ¦¬ν”„λ…Έλ“œμΌ λ•Œ
        if(depth&1) odd_height_cnt++;
        return;
    }
    visited[node] = 1;
    for(auto next: graph[node]){
        if(!visited[next]){
            dfs(next, depth+1);
        }
    }
}
int main(){
    
    /*
     높이가 ν™€μˆ˜μΈ λ¦¬ν”„λ…Έλ“œκ°€ ν™€μˆ˜κ°œλ©΄ 이기고 짝수개면 μ§„λ‹€.
     */
    
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>N;
    for(int i=0; i<N-1; i++){
        int a,b; cin>>a>>b;
        graph[a].push_back(b);
        graph[b].push_back(a);
    }
    
    dfs(1, 0);
    
    if(odd_height_cnt % 2 == 0) cout<<"No";
    else cout<<"Yes";
}

 

풀이

νŠΈλ¦¬κ°€ μ–΄λ–»κ²Œ λ˜μ–΄μžˆμ–΄μ•Ό 성원이가 이길 수 μžˆμ„μ§€ ν‚€ 포인트λ₯Ό λ– μ˜¬λ €μ•Ό ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

이 문제의 ν‚€ ν¬μΈνŠΈλŠ” 성원이가 νŠΈλ¦¬μ—μ„œ 높이가 ν™€μˆ˜μΈ 리프 λ…Έλ“œκ°€ ν™€μˆ˜ 개면 이기고 짝수 개면 μ§„λ‹€. μž…λ‹ˆλ‹€.

λ”°λΌμ„œ 각 리프 λ…Έλ“œκΉŒμ§€μ˜ 높이가 ν™€μˆ˜μΈ 리프 λ…Έλ“œμ˜ κ°œμˆ˜κ°€ λͺ‡ κ°œμΈμ§€λ₯Ό μ°Ύμ•„μ„œ 쑰건에 맞게 Yes와 Noλ₯Ό 좜λ ₯ν•˜λ©΄ λ©λ‹ˆλ‹€.