제출 #1160955

#제출 시각아이디문제언어결과실행 시간메모리
1160955achiCijanobakterije (COCI21_cijanobakterije)C++20
6 / 70
1095 ms15168 KiB
#include <bits/stdc++.h>

using namespace std;

vector<vector<int>> graph;
vector<vector<int>> group_members;
vector<bool> visited;
vector<int> links;
vector<int> dist;
int id = 0;

void dfs(int u) {
    if (visited[u]) return;
    visited[u] = true;
    if (links[u] < 2) group_members[id].push_back(u);
    for (auto v : graph[u]) {
        if (!visited[v]) dfs(v);
    }
}

int bfs (int u, int V) {
    queue<int> q;
    int curr = 1;
    int next = 0;
    int depth = 0;
    q.push(u);
    while (!q.empty()) {
        u = q.front();
        q.pop();
        curr--;
        if (visited[u]) continue;
        for (auto v : graph[u]) {
            if (visited[v]) continue;
            q.push(v);
            next++;
        }
        visited[u] = true;
        if (curr <= 0) {
            curr = next;
            next = 0;
            depth++;
        }
    }
    return depth;
}

int main () {
    cin.tie(0)->sync_with_stdio(0);
    int V, E;
    int u, v;
    int max_len = INT_MIN;
    
    cin >> V >> E;
    graph.resize(V);
    group_members.resize(V);
    visited.assign(V, false);
    links.assign(V, 0);
    dist.assign(V, 1);

    for (int i = 0; i < E; i++) {
        cin >> u >> v;
        u--;
        v--;
        graph[u].push_back(v);
        graph[v].push_back(u);
        links[u]++;
        links[v]++;
    }

    for (int i = 0; i < V; i++) {
        if (visited[i]) continue;
        dfs(i);
        id++;
    }

    for (int i = 1; i < id; i++) {
        graph[group_members[i-1].back()].push_back(group_members[i].back());
        graph[group_members[i].back()].push_back(group_members[i-1].back());
        links[group_members[i].back()]++;
        links[group_members[i-1].back()]++;
        if (links[group_members[i].back()] > 1) {
            group_members[i].pop_back();
        }
        if (links[group_members[i-1].back()] > 1) {
            group_members[i-1].pop_back();
        }
    }

    for (int i = 0; i < V; i++) {
        if (links[i] > 1) continue;
        visited.assign(V, false);
        max_len = max(max_len, bfs(i, V));
    }

    cout << max_len;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...