Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7)8 910 1112func CF1000E(_r io.Reader, out io.Writer) {13 in := bufio.NewReader(_r)14 min := func(a, b int) int {15 if a < b {16 return a17 }18 return b19 }20 type neighbor struct{ to, eid int }21 type edge struct{ v, w int }22 23 var n, m, v, w, u, ans int24 Fscan(in, &n, &m)25 g := make([][]neighbor, n)26 edges := make([]edge, m)27 for i := 0; i < m; i++ {28 Fscan(in, &v, &w)29 v--30 w--31 g[v] = append(g[v], neighbor{w, i})32 g[w] = append(g[w], neighbor{v, i})33 edges[i] = edge{v, w}34 }35 36 isBridge := make([]bool, m)37 dfn := make([]int, n)38 dfsClock := 039 var f func(v, fa int) int40 f = func(v, fa int) int {41 dfsClock++42 dfn[v] = dfsClock43 lowV := dfsClock44 for _, e := range g[v] {45 w := e.to46 if dfn[w] == 0 {47 lowW := f(w, v)48 if lowW > dfn[v] {49 isBridge[e.eid] = true50 }51 lowV = min(lowV, lowW)52 } else if w != fa && dfn[w] < dfn[v] {53 lowV = min(lowV, dfn[w])54 }55 }56 return lowV57 }58 for i, t := range dfn {59 if t == 0 {60 f(i, -1)61 }62 }63 ids := make([]int, n)64 idCnt := 065 var f2 func(int)66 f2 = func(v int) {67 ids[v] = idCnt68 for _, e := range g[v] {69 if w := e.to; ids[w] == 0 && !isBridge[e.eid] {70 f2(w)71 }72 }73 }74 for i, id := range ids {75 if id == 0 {76 idCnt++77 f2(i)78 }79 }80 81 t := make([][]int, idCnt+1)82 for _, e := range edges {83 if v, w := ids[e.v], ids[e.w]; v != w {84 t[v] = append(t[v], w)85 t[w] = append(t[w], v)86 }87 }88 var f3 func(v, fa, d int)89 f3 = func(v, fa, d int) {90 if d > ans {91 ans = d92 u = v93 }94 for _, w := range t[v] {95 if w != fa {96 f3(w, v, d+1)97 }98 }99 }100 ans = -1101 f3(1, 0, 0)102 ans = -1103 f3(u, 0, 0)104 Fprint(out, ans)105}106 107108