제출 #696404

#제출 시각아이디문제언어결과실행 시간메모리
696404finn__어르신 집배원 (BOI14_postmen)C++17
38 / 100
1083 ms17496 KiB
#include <bits/stdc++.h>
using namespace std;

struct Edge
{
    unsigned u, v, i, j; // u <-> i, v <-> j;

    Edge(unsigned u_, unsigned v_, unsigned i_, unsigned j_)
    {
        u = u_, v = v_, i = i_, j = j_;
    }
};

vector<vector<Edge>> g;
vector<bool> visited;

void delete_edge(Edge e)
{
    swap(g[e.u][e.i], g[e.u].back());
    swap(g[e.v][e.j], g[e.v].back());
    g[e.u].erase(g[e.u].end() - 1);
    g[e.v].erase(g[e.v].end() - 1);

    if (e.i < g[e.u].size())
    {
        g[e.u][e.i].i = e.i;
        g[g[e.u][e.i].v][g[e.u][e.i].j].j = e.i;
    }
    if (e.j < g[e.v].size())
    {
        g[e.v][e.j].i = e.j;
        g[g[e.v][e.j].v][g[e.v][e.j].j].j = e.j;
    }
}

unsigned get_next_edge(unsigned u, unsigned p)
{
    for (size_t i = 0; i < g[u].size(); i++)
        if (g[u][i].v != p)
            return i;
}

Edge find_edge(unsigned u, unsigned v)
{
    for (Edge const &e : g[u])
        if (e.v == v)
            return e;
}

unsigned find_circuit(unsigned u, unsigned p = -1)
{
    if (visited[u])
        return u;
    visited[u] = 1;

    assert(!g[u].empty());
    Edge e = g[u][get_next_edge(u, p)];
    unsigned x = find_circuit(e.v, u);

    visited[u] = 0;
    if (x != UINT_MAX)
    {
        cout << u + 1 << ' ' << flush;
        delete_edge(find_edge(u, e.v));
        if (u == x)
            x = UINT_MAX;
    }

    return x;
}

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

    size_t n, m;
    cin >> n >> m;

    g = vector<vector<Edge>>(n);
    visited = vector<bool>(n, 0);

    for (size_t i = 0; i < m; i++)
    {
        unsigned u, v;
        cin >> u >> v;
        u--, v--;
        g[u].emplace_back(u, v, g[u].size(), g[v].size());
        g[v].emplace_back(v, u, g[v].size(), g[u].size() - 1);
    }

    for (unsigned u = 0; u < n; u++)
    {
        while (!g[u].empty())
        {
            find_circuit(u);
            cout << '\n';
        }
    }
}

컴파일 시 표준 에러 (stderr) 메시지

postmen.cpp: In function 'unsigned int get_next_edge(unsigned int, unsigned int)':
postmen.cpp:41:1: warning: control reaches end of non-void function [-Wreturn-type]
   41 | }
      | ^
postmen.cpp: In function 'Edge find_edge(unsigned int, unsigned int)':
postmen.cpp:48:1: warning: control reaches end of non-void function [-Wreturn-type]
   48 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...