天天看點

Luogu 3174 [HAOI2009]毛毛蟲

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <vector>
#include <iomanip>
#define
#define
#define

using namespace std;
struct node {
    int next, to;
}edge[A];
int head[A], num_edge;
void add_edge(int from, int to) {
    edge[++num_edge].next = head[from];
    edge[num_edge].to = to;
    head[from] = num_edge;
}
int n, m, a, b, f[A], cnt[A], ans;
void dfs(int fr, int fa) {
    for (int i = head[fr]; i; i = edge[i].next) {
        int ca = edge[i].to;
        if (ca == fa) continue;
        cnt[fr]++;
    }
    for (int i = head[fr]; i; i = edge[i].next) {
        int ca = edge[i].to;
        if (ca == fa) continue;
        dfs(ca, fr);
        ans = max(ans, f[fr] + f[ca] - 1 + (fa > 0 ? 1 : 0));
        f[fr] = max(f[fr], f[ca] + cnt[fr]);
    }
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        cin >> a >> b;
        add_edge(a, b);
        add_edge(b, a);
    }
    fill(f + 1, f + n + 1, 1);
    dfs(1, 0);
    cout << ans << endl;
}