Esta pregunta es en realidad un árbol sin raíces de las preguntas el diámetro del árbol:
Como se muestra, primero de acuerdo con la práctica anterior, el árbol está determinada por dos diámetro BFS, es decir, AB.
De hecho, se encontró en la práctica, los problemas requieren max {AB + BC} (BC <AC), o max {AB + AC} (AC <BC), entonces las dos ecuaciones se pueden combinar para encontrar max {AB + min {BC , CA}}.
Como punto siempre que el diámetro del punto final determinado A, B, C y luego enumeró, que es el máximo buscan respuestas.
código:
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <cola> 5 usando espacio de nombres std; 6 typedef largo largo ll; 7 const int maxN = 200.005 ; 8 struct nodo { 9 ll a, siguiente, val; 10 } borde [maxN << 1 ]; 11 ll d [maxN], k [maxN], la cabeza [maxN], vis [maxN]; 12 int n, m, tot; 13 cola < int > q; 14 void add ( int u, int v, int w) { 15 borde [tot] .a = v; 16 borde [tot] .Next = cabeza [u]; 17 borde [tot] .val = w; 18 cabeza [u] = tot ++ ; 19 } 20 int BFS ( int s) { 21 ll maxd = 0 , Max; 22 memset (d, 0 , sizeof (d)); 23 memset (vis, 0 , sizeof (vis)); 24 , mientras que (!q.empty ()) q.pop (); 25 q.push (s); vis [s] = 1 ; 26 , mientras que (! {Q.empty ()) 27 int u = q.front (), v; q.pop (); 28 para ( int i = cabeza [u]; i = - 1 ; i = borde [i] .A continuación) { 29 si (vis [v = orilla [i] .a]) continuará ; 30 vis [v] = 1 ; 31 d [v] = d [u] + borde [i] .val; 32 q.push (v); 33 si (d [v]> maxd) { 34 maxd = d [v]; 35 Max = v; 36 } 37 } 38 } 39 de retorno Max; 40 } 41 int main () { 42 // freopen ( "1.in", "r", la entrada estándar); 43 memset (cabeza, - 1 , sizeof (cabeza)); 44 scanf ( " % d% d " , y n, y m); 45 para ( int i = 1 ; i <= m; i ++ ) { 46 ll x, y, z; 47 scanf ( "% LLD% LLD% LLD " , y x, y y, y z); 48 add (x, y, z); add (y, x, z); 49 } 50 int l = BFS ( 1 ); // A 51 int r = BFS (l); // B 52 ll ans = d [r]; // 直径长度 53 para ( int i = 1 ; i <= n; i ++) k [i] = d [i]; / / k: AC长度 54 BFS (r); 55 ll M = 0 ; 56 para ( int i = 1 ; i <= n; i ++) M = max (M, min (d [i], k [i]) );// Enumeración punto C d: longitud BC 57 es el printf ( " % LLD \ n- " , ANS + M); 58 de retorno 0 ; 59 }