algorithm

BOJ 1976

rkawk 2022. 10. 15. 15:27

문제

더보기

μ—¬ν–‰ κ°€μž μ„±κ³΅

 
2 초 128 MB 26240 10120 7526 37.525%

문제

λ™ν˜μ΄λŠ” μΉœκ΅¬λ“€κ³Ό ν•¨κ»˜ 여행을 κ°€λ €κ³  ν•œλ‹€. ν•œκ΅­μ—λŠ” λ„μ‹œκ°€ N개 있고 μž„μ˜μ˜ 두 λ„μ‹œ 사이에 길이 μžˆμ„ μˆ˜λ„, 없을 μˆ˜λ„ μžˆλ‹€. λ™ν˜μ΄μ˜ μ—¬ν–‰ 일정이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 μ—¬ν–‰ κ²½λ‘œκ°€ κ°€λŠ₯ν•œ 것인지 μ•Œμ•„λ³΄μž. λ¬Όλ‘  쀑간에 λ‹€λ₯Έ λ„μ‹œλ₯Ό κ²½μœ ν•΄μ„œ 여행을 ν•  μˆ˜λ„ μžˆλ‹€. 예λ₯Ό λ“€μ–΄ λ„μ‹œκ°€ 5개 있고, A-B, B-C, A-D, B-D, E-A의 길이 있고, λ™ν˜μ΄μ˜ μ—¬ν–‰ κ³„νšμ΄ E C B C D 라면 E-A-B-C-B-C-B-DλΌλŠ” μ—¬ν–‰κ²½λ‘œλ₯Ό 톡해 λͺ©μ μ„ 달성할 수 μžˆλ‹€.

λ„μ‹œλ“€μ˜ κ°œμˆ˜μ™€ λ„μ‹œλ“€ κ°„μ˜ μ—°κ²° μ—¬λΆ€κ°€ μ£Όμ–΄μ Έ 있고, λ™ν˜μ΄μ˜ μ—¬ν–‰ κ³„νšμ— μ†ν•œ λ„μ‹œλ“€μ΄ μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ‘Œμ„ λ•Œ κ°€λŠ₯ν•œμ§€ μ—¬λΆ€λ₯Ό νŒλ³„ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 같은 λ„μ‹œλ₯Ό μ—¬λŸ¬ 번 λ°©λ¬Έν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€.

μž…λ ₯

첫 쀄에 λ„μ‹œμ˜ 수 N이 μ£Όμ–΄μ§„λ‹€. N은 200μ΄ν•˜μ΄λ‹€. λ‘˜μ§Έ 쀄에 μ—¬ν–‰ κ³„νšμ— μ†ν•œ λ„μ‹œλ“€μ˜ 수 M이 μ£Όμ–΄μ§„λ‹€. M은 1000μ΄ν•˜μ΄λ‹€. λ‹€μŒ N개의 μ€„μ—λŠ” N개의 μ •μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. i번째 μ€„μ˜ j번째 μˆ˜λŠ” i번 λ„μ‹œμ™€ j번 λ„μ‹œμ˜ μ—°κ²° 정보λ₯Ό μ˜λ―Έν•œλ‹€. 1이면 μ—°κ²°λœ 것이고 0이면 연결이 λ˜μ§€ μ•Šμ€ 것이닀. A와 Bκ°€ μ—°κ²°λ˜μ—ˆμœΌλ©΄ B와 A도 μ—°κ²°λ˜μ–΄ μžˆλ‹€. λ§ˆμ§€λ§‰ μ€„μ—λŠ” μ—¬ν–‰ κ³„νšμ΄ μ£Όμ–΄μ§„λ‹€. λ„μ‹œμ˜ λ²ˆν˜ΈλŠ” 1λΆ€ν„° NκΉŒμ§€ μ°¨λ‘€λŒ€λ‘œ 맀겨져 μžˆλ‹€.

좜λ ₯

첫 쀄에 κ°€λŠ₯ν•˜λ©΄ YES λΆˆκ°€λŠ₯ν•˜λ©΄ NOλ₯Ό 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1 λ³΅μ‚¬

3
3
0 1 0
1 0 1
0 1 0
1 2 3

예제 좜λ ₯ 1 λ³΅μ‚¬

YES​

풀이

λ„μ‹œλΌλ¦¬ μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€λ§Œ νŒŒμ•…ν•˜λ©΄ λ˜λŠ” λ¬Έμ œμ΄λ‹€.

λͺ¨λ“  λ…Έλ“œμ—μ„œ 탐색을 ν•  μˆ˜λ„ μžˆμ§€λ§Œ, μ΄λ ‡κ²Œ 되면 λ…Έλ“œμ˜ 개수 N, κ°„μ„ μ˜κ°œμˆ˜ M이라 ν–ˆμ„λ•Œ (NM)^2κ°€ 되기 λ•Œλ¬Έμ— μ‹œκ°„μ΄ˆκ³Όκ°€ 날것이닀.

κ·ΈλŸ¬λ―€λ‘œ 이 λ¬Έμ œλŠ” disjoint-set으둜 ν’€μ–΄μ•Ό λœλ‹€.

μ–΄μ²˜ν”Ό μ—°κ²°λ˜μ–΄μžˆλŠ”μ§€λ§Œ νŒŒμ•…ν•˜λ©΄ 되기 λ•Œλ¬Έμ΄λ‹€.

 

λ…Έλ“œκ°€ 200κ°œλ°–μ— μ•ˆλ˜κΈ° λ•Œλ¬Έμ— 이차원 λ°°μ—΄λ‘œ κ·Έλž˜ν”„λ₯Ό λ§Œλ“€μ–΄μ£Όκ³ 

int graph[201][201];

λͺ¨λ“  λ…Έλ“œμ˜ 간선을 ν•œλ²ˆμ”© νŒŒμ•…ν•΄μ£Όλ©΄μ„œ λ…Έλ“œμ˜ λ²ˆν˜Έκ°€ μž‘μ€κ²ƒμ΄ λΆ€λͺ¨λ…Έλ“œκ°€ 되게 μ΄ˆκΈ°ν™” ν•΄μ€€λ‹€.

κ·Έλ ‡κ²Œ ν•˜κΈ°μœ„ν•΄ intν˜• λ°°μ—΄ ν•˜λ‚˜λ₯Ό λ§Œλ“€μ–΄μ„œ λ…Έλ“œλ²ˆν˜Έμ— ν•΄λ‹Ήν•˜λŠ” 숫자λ₯Ό λ„£μ–΄μ£Όκ³ 

vector<int>v(201);
    for(int i=1; i<=N; i++)
        v[i] = i;

ν•œλ²ˆ κ°±μ‹ ν•΄μ€„λ•Œλ§ˆλ‹€ λͺ¨λ“  λ…Έλ“œλ₯Ό λŒμ•„μ£Όλ©΄μ„œ μžμ‹λ…Έλ“œλ‘œ λ“€μ–΄κ°„ λ…Έλ“œκ°€ λΆ€λͺ¨λ…Έλ“œμΈ 경우λ₯Ό μ „λΆ€ κ°±μ‹ ν•΄μ€€λ‹€.

for(int i=1; i<=N; i++)
        for(int j=1; j<=N; j++){
            if(i == j) continue;
            if(graph[i][j] == 0) continue;
            if(v[i] == v[j]) continue;
            int parent = min(v[i],v[j]);
            int child = max(v[i],v[j]);
            for(int k = 1; k<=N; k++){
                if(v[k] != child) continue;
                v[k] = parent;
            }
        }

그러면 disjoint-set이 생기기 λ•Œλ¬Έμ—, 여행닀닐 지역을 μˆœμ„œλŒ€λ‘œ λ³΄λ©΄μ„œ λΆ€λͺ¨λ…Έλ“œκ°€ λ‹€ κ°™μœΌλ©΄ yes, ν•˜λ‚˜λΌλ„ λ‹€λ₯΄λ©΄ noλ₯Ό 좜λ ₯ν•˜λ©΄ λœλ‹€.

 

 

전체 μ½”λ“œ

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int>v(201);
vector<int>trip;
int graph[201][201];
int N,M,ans=1;
int main(){
    cin>>N>>M;
    for(int i=1; i<=N; i++)
        for(int j=1; j<=N; j++){
            cin>>graph[i][j];
        }
    for(int i=0; i<M; i++){
        int input;
        cin>>input;
        trip.push_back(input);
    }
    for(int i=1; i<=N; i++)
        v[i] = i;
    for(int i=1; i<=N; i++)
        for(int j=1; j<=N; j++){
            if(i == j) continue;
            if(graph[i][j] == 0) continue;
            if(v[i] == v[j]) continue;
            int parent = min(v[i],v[j]);
            int child = max(v[i],v[j]);
            for(int k = 1; k<=N; k++){
                if(v[k] != child) continue;
                v[k] = parent;
            }
        }
    int check = 0;
    for(auto t : trip){
        if(check == 0)
            check = v[t];
        else{
            if(check != v[t]){
                ans = 0;
                break;
            }
        }   
    }
    if(ans == 1)
        cout<<"YES";
    else
        cout<<"NO";
}

 

'algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

BOJ 6087  (1) 2024.03.20
BOJ 5615  (0) 2024.03.15
BOJ 17143  (1) 2022.10.13
BOJ 1445  (1) 2022.10.13
BOJ 2056  (2) 2022.10.10