반응형
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;
}
반응형
'Algorithm > problem' 카테고리의 다른 글
백준 14868번 : 문명 - BFS Union&Find C++ (0) | 2022.03.01 |
---|---|
백준 1178번 : 간선 추가 - 오일러 경로 , Union&Find 알고리즘 (0) | 2022.02.28 |
백준 1199번: 오일러 회로 시간초과 해결 (0) | 2022.02.28 |
백준 18111번 : 마인크래프트 C++ 코드 (0) | 2022.02.26 |
백준 1948번: 임계경로 - 위상정렬 C++ (0) | 2022.02.26 |