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

[λ°±μ€€,c++] 20040번 - 사이클 κ²Œμž„

dkswnkk 2022. 9. 7. 00:08

문제

 

20040번: 사이클 κ²Œμž„

사이클 κ²Œμž„μ€ 두 λͺ…μ˜ ν”Œλ ˆμ΄μ–΄κ°€ μ°¨λ‘€λŒ€λ‘œ λŒμ•„κ°€λ©° μ§„ν–‰ν•˜λŠ” κ²Œμž„μœΌλ‘œ, μ„  ν”Œλ ˆμ΄μ–΄κ°€ ν™€μˆ˜ 번째 μ°¨λ‘€λ₯Ό, ν›„ ν”Œλ ˆμ΄μ–΄κ°€ 짝수 번째 μ°¨λ‘€λ₯Ό μ§„ν–‰ν•œλ‹€. κ²Œμž„ μ‹œμž‘ μ‹œ 0 λΆ€ν„° n − 1 κΉŒμ§€ κ³ μœ ν•œ

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
using namespace std;

int parent[500001];

int n, m;

int find_parent(int x){
    if(x == parent[x]) return x;
    else return parent[x] = find_parent(parent[x]);
}

void union_parent(int a, int b){
    a = find_parent(a);
    b = find_parent(b);
    
    if(a < b) parent[b] = a;
    else parent[a] = b;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    cin>>n>>m;
    int ans = 0;
    for(int i=1; i<=n; i++) parent[i] = i;
    for(int i=0; i<m; i++){
        int a, b; cin>>a>>b;
        if(find_parent(a) == find_parent(b)){
            ans = i + 1;
            break;
        }
        union_parent(a, b);
    }
    cout<<ans;
    
}

 

풀이

μœ λ‹ˆμ˜¨ νŒŒμΈλ“œ λ¬Έμ œμž…λ‹ˆλ‹€.

λ‹¨μˆœν•˜κ²Œ κ·Έλƒ₯ λΆ€λͺ¨κ°€ 같을 κ²½μš°μ—λŠ” 사이클이 μƒκΈ΄λ‹€λŠ” 말이기에 μˆœμ„œλ₯Ό 좜λ ₯ν•΄μ£Όκ³ , λΆ€λͺ¨κ°€ λ‹€λ₯΄λ‹€λ©΄ λΆ€λͺ¨λ₯Ό 합쳐주면 λ©λ‹ˆλ‹€.