제출 #1268730

#제출 시각아이디문제언어결과실행 시간메모리
1268730s1zzl3Cijanobakterije (COCI21_cijanobakterije)C++20
36 / 70
1093 ms9284 KiB
#include <bits/stdc++.h>
using namespace std;
#define nl '\n'
typedef long long ll;
const int MAXN = 1e5+5;

int n,m;
vector<int> graph[MAXN];
bool visited[MAXN];
int dist[MAXN];

// DFS để đánh dấu thành phần liên thông
void dfsMark(int u) {
    visited[u] = true;
    for (int v : graph[u]) {
        if(!visited[v]) dfsMark(v);
    }
}

// DFS để tính khoảng cách xa nhất từ 1 node
void dfsDist(int u, int pre) {
    for (int v : graph[u]) {
        if(v != pre) {
            dist[v] = dist[u] + 1;
            dfsDist(v,u);
        }
    }
}

// Tính đường kính của 1 thành phần liên thông chứa node "start"
int calcDiameter(int start) {
    // Lần 1: tìm đỉnh xa nhất từ start
    fill(dist, dist+n+1, -1);
    dist[start] = 0;
    dfsDist(start,-1);

    int far = start;
    for (int i=1; i<=n; i++) {
        if(dist[i] > dist[far]) far = i;
    }

    // Lần 2: từ far tìm xa nhất
    fill(dist, dist+n+1, -1);
    dist[far] = 0;
    dfsDist(far,-1);

    int diam = 0;
    for (int i=1; i<=n; i++) {
        if(dist[i] >= 0) diam = max(diam, dist[i]);
    }
    return diam+1; // +1 để tính số đỉnh (nếu muốn tính theo số cạnh thì bỏ +1)
}

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

    cin >> n >> m;
    for (int i=1; i<=m; i++) {
        int u,v; cin >> u >> v;
        graph[u].push_back(v);
        graph[v].push_back(u);
    }

    ll res = 0;
    fill(visited, visited+n+1, false);

    for (int i=1; i<=n; i++) {
        if(!visited[i]) {
            // đánh dấu cả thành phần
            dfsMark(i);
            // tính đường kính của thành phần này
            res += calcDiameter(i);
        }
    }

    cout << res << nl;
}
#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...