Los estudiantes encuentran - (diámetro del árbol)

 

 

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 }

 

Supongo que te gusta

Origin www.cnblogs.com/Lour688/p/12668474.html
Recomendado
Clasificación