8461 2024. 01. 16 20:57:29 anon Maximális kaktusz (45 pont) cpp17 Elfogadva 45/45 34ms 12692 KiB
#include <bits/stdc++.h>
#define HANDLE_STREAK \
    if(streak >= 3) { \
        ans++; \
        streak = 0; \
    }
#define FastIO ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)
using namespace std;
typedef long long ll;
ll remove_cycles(ll vertex, ll parent, vector<bool> &bad_nodes, vector<bool> &vis, const vector<vector<ll>> &graph) {
    ll detected, result;
    if(vis[vertex]) {
        bad_nodes[vertex] = true;
        return vertex;
    }
    vis[vertex] = true;
    result = 0;
    for(const auto &x : graph[vertex]) {
        if(x == parent || bad_nodes[x])
            continue;
        detected = remove_cycles(x, vertex, bad_nodes, vis, graph);
        if(detected) {
            bad_nodes[vertex] = true;
            if(detected != vertex)
                result = detected;
        }
    }
    return result;
}
ll dfs(ll vertex, ll streak, ll &ans, vector<bool> &vis, const vector<vector<ll>> &graph) {
    ll rem;
    vis[vertex] = true;
    vector<ll> nbs;
    for(const auto &x : graph[vertex]) {
        if(!vis[x])
            nbs.push_back(x);
    }
    if(nbs.empty()) {
        HANDLE_STREAK;
        return streak;
    }
    else if(nbs.size() == 1) {
        HANDLE_STREAK;
        return dfs(nbs[0], streak + 1, ans, vis, graph);
    }
    else if(nbs.size() >= 2) {
        vector<ll> rs;
        for(const auto &x : nbs) {
            rem = dfs(x, 1, ans, vis, graph);
            if(rem)
                rs.push_back(rem);
        }
        if(rs.empty()) {
            HANDLE_STREAK;
            return streak;
        }
        else if(rs.size() == 1) {
            HANDLE_STREAK;
            ans += (streak + rs[0]) / 3;
            return (streak + rs[0]) % 3;
        }
        else if(rs.size() >= 2) {
            ans++;
            return streak - 1;
        }
    }
    return streak;
}
int main() {
    FastIO;
    ll i, u, v, ans, N, M;
    cin >> N >> M;
    vector<vector<ll>> graph(N + 1);
    for(i = 0; i < M; i++) {
        cin >> u >> v;
        graph[u].push_back(v);
        graph[v].push_back(u);
    }
    vector<bool> vis(N + 1, false);
    vector<bool> bad_nodes(N + 1, false);
    remove_cycles(1, -1, bad_nodes, vis, graph);
    ans = 0;
    for(i = 1; i <= N; i++) {
        if(!bad_nodes[i])
            dfs(i, 1, ans, bad_nodes, graph);
    }
    cout << ans << '\n';
    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 45/45
1 Elfogadva 0/0 3ms 1828 KiB
2 Elfogadva 0/0 3ms 2220 KiB
3 Elfogadva 1/1 3ms 2268 KiB
4 Elfogadva 1/1 3ms 2484 KiB
5 Elfogadva 1/1 3ms 2568 KiB
6 Elfogadva 2/2 3ms 2692 KiB
7 Elfogadva 2/2 3ms 2944 KiB
8 Elfogadva 2/2 3ms 2920 KiB
9 Elfogadva 1/1 3ms 3124 KiB
10 Elfogadva 1/1 3ms 3204 KiB
11 Elfogadva 1/1 3ms 3296 KiB
12 Elfogadva 1/1 3ms 3296 KiB
13 Elfogadva 1/1 3ms 3428 KiB
14 Elfogadva 1/1 3ms 3612 KiB
15 Elfogadva 1/1 3ms 3740 KiB
16 Elfogadva 1/1 3ms 3648 KiB
17 Elfogadva 1/1 3ms 3936 KiB
18 Elfogadva 1/1 32ms 9884 KiB
19 Elfogadva 1/1 26ms 10200 KiB
20 Elfogadva 1/1 34ms 9808 KiB
21 Elfogadva 1/1 32ms 9912 KiB
22 Elfogadva 2/2 28ms 12268 KiB
23 Elfogadva 2/2 23ms 12080 KiB
24 Elfogadva 2/2 21ms 12300 KiB
25 Elfogadva 2/2 21ms 12372 KiB
26 Elfogadva 1/1 3ms 4184 KiB
27 Elfogadva 1/1 3ms 4244 KiB
28 Elfogadva 1/1 3ms 4448 KiB
29 Elfogadva 1/1 27ms 12492 KiB
30 Elfogadva 1/1 26ms 12180 KiB
31 Elfogadva 1/1 26ms 12668 KiB
32 Elfogadva 1/1 25ms 12672 KiB
33 Elfogadva 2/2 27ms 12692 KiB
34 Elfogadva 2/2 27ms 12536 KiB
35 Elfogadva 2/2 24ms 12672 KiB
36 Elfogadva 2/2 24ms 12668 KiB