페이지

레이블이 eulerian circuit인 게시물을 표시합니다. 모든 게시물 표시
레이블이 eulerian circuit인 게시물을 표시합니다. 모든 게시물 표시

3204번: 커플 깨기

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


$O(nm)$

문제를 항상 해결할 수 있는 방법을 찾아보자.
모든 노드의 차수가 짝수이면 오일러서킷을 찾아 해결할 수 있다.(간선 방향은 탐색 방향으로 결정된다.)
노드의 차수가 홀수인 것이 존재한다면(이러한 노드의 개수는 항상 짝수이다.) 이러한 노드들을 하나의 더미 노드와 연결하고 오일러 서킷을 찾으면 된다.
오일러 서킷을 찾은 뒤 더미 노드와 연결된 간선을 제거하면 된다, 더미 노드는 단 하나이므로 주어진 조건을 만족한다.
입력데이터에 분리된 그래프가 주어지는 경우도 있으니 유의해서 해결하자.


#include<cstdio>
const int MAX_N = 1e3;
int n, m, adj[MAX_N + 1][MAX_N + 1];
void dfs(int h) {
    for (int i = 0; i <= n; i++) {
        if (!adj[h][i]) continue;
        adj[h][i] = adj[i][h] = 0;
        dfs(i);
        if (h&&i) printf("%d %d\n", h, i);
    }
}
int main() {
    scanf("%d %d", &n, &m);
    for (int i = 0, x, y; i < m; i++) {
        scanf("%d %d", &x, &y);
        adj[x][y] = adj[y][x] = 1;
    }
    for (int i = 1, c; i <= n; i++) {
        c = 0;
        for (int j = 1; j <= n; j++) c += adj[i][j];
        if (c & 1) adj[0][i] = adj[i][0] = 1;
    }
    puts("Yes");
    for (int i = 1; i <= n; i++) dfs(i);
    return 0;
}

1199번: 오일러 회로

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


#include<cstdio>
const int MAX_N = 1e3;
int n, adj[MAX_N][MAX_N];
void dfs(int h) {
    for (int i = 0; i<n; i++) while (adj[h][i]) {
        adj[h][i]--;
        adj[i][h]--;
        dfs(i);
    }
    printf("%d ", h + 1);
}
int main() {
    scanf("%d", &n);
    for (int i = 0, c = 0; i<n; i++) {
        for (int j = 0; j<n; j++) {
            scanf("%d", &adj[i][j]);
            c += adj[i][j];
        }
        if (c & 1) {
            puts("-1");
            return 0;
        }
    }
    dfs(0);
    return 0;
}