PS

BOJ 16168 : 퍼레이드

lickelon 2024. 7. 31. 22:27
  • 문제 링크 : boj.kr/16168
  • 난이도 : G4
  • 태그 : 오일러 경로, 유니온파인드

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

int parent[3001];

int find(int a) {
    if(a == parent[a]) return a;
    return parent[a] = find(parent[a]);
}

void merge(int a, int b) {
    a = find(a), b = find(b);
    parent[a] = b;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int v, e;
    cin >> v >> e;

    for(int i = 1; i <= v; i++) parent[i] = i;

    vector<int> cnt(v+1);
    for(int i = 0; i < e; i++) {
        int a, b;
        cin >> a >> b;
        cnt[a]++;
        cnt[b]++;
        merge(a, b);
    }

    bool chk = true;
    int p = find(1);
    int odd = 0;
    for(int i = 1; i <= v; i++) {
        if(p != find(i)) chk = false;
        if(cnt[i] % 2) odd++;
    }
    if(odd != 0 && odd != 2) chk = false;

    cout << (chk ? "YES" : "NO");
    return 0;
}

풀이

모든 지점을 지나는 한 붓 그리기가 가능한지를 확인하면 된다.

모든 정점이 연결되어 있고, 홀수 개의 간선을 가지는 정점이 0개 혹은 2개이면 된다.

유니온 파인드를 통해 정점의 연결을 확인하면 된다.

'PS' 카테고리의 다른 글

BOJ 1744 : 수 묶기  (0) 2024.08.02
BOJ 27570 : Chocolate Chip Fabrication  (0) 2024.08.01
BOJ 2437 : 저울  (0) 2024.07.30
BOJ 2812 : 크게 만들기  (0) 2024.07.29
BOJ 16615 : Dropping Blocks  (0) 2024.07.28