반응형

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

 

16168번: 퍼레이드

첫 번째 줄에 지점의 개수 V, 연결 구간의 개수 E가 주어진다. (1 ≤ V ≤ E ≤ 3000) 이후 E개의 줄에 걸쳐 각 연결 구간이 연결하는 두 지점의 번호 Va, Vb가 공백을 사이에 두고 주어진다. (1 ≤ Va,

www.acmicpc.net

 

 

1. 컴포넌트 수가 1개여야 한다.

 

2. 오일러 회로이거나 오일러 경로여야한다. (차수가 홀수인 노드가 2개거나 0개여야한다)

 

#include <bits/stdc++.h>
using namespace std;

struct Edge {
    int to, c;
    Edge* dual;
    Edge() : Edge(-1, 0) {};
    Edge(int to1, int c1) :to(to1), c(c1), dual(nullptr) {};
};


vector<Edge*> adj[3001];
int v,e,degree[3001];
int odd;
bool visited[3001];

int DFS(int x) {
    int res = 1;
    visited[x] = 1;
    for (Edge* e : adj[x]) {
        if (e->c > 0 && visited[e->to]==0) {
            e->c--;
            e->dual->c--;
            res += DFS(e->to);
        }
    }
    return res;
}


int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> v >> e;
    for (int i = 0; i < e; i++) {
        int a,b;
        cin >> a >> b;
        Edge* e1 = new Edge(b, 1), *e2 = new Edge(a,1);
        e1->dual = e2;
        e2->dual = e1;

        adj[a].push_back(e1);
        adj[b].push_back(e2);

        degree[a]++;
        degree[b]++;
    }

    for (int i = 1; i <= v; i++) {
        if (degree[i] % 2 == 1) {
            odd++;
        }

        if (odd > 2) {
            cout << "NO";
            return 0;
        }
    }

    bool flag = false;

    for (int i = 1; i <= v; i++) {
        if (!visited[i]) {
            int res = DFS(i);
            if (res > 1) {
                if (flag) {
                    cout << "NO";
                    return 0;
                }
                else {
                    flag = true;
                }
            }
        }
    }

    cout << "YES";

    return 0;
}

 

반응형

+ Recent posts