semana 6 A Krypton Belt East

Titulo:

Había una computadora (número 1) en el laboratorio. Recientemente, Kryptonian Kurudong compró computadoras N-1 para el laboratorio, numeradas del 2 al N. Cada computadora está conectada a una computadora previamente instalada con un cable de red. Pero Gugudong está preocupado de que la velocidad de la red sea demasiado lenta, quiere saber la longitud máxima del cable desde la i-ésima computadora a otras computadoras, pero el pobre Gugudong acaba de sufrir un ataque inteligente de rayos cósmicos no hace mucho. Por favor, ayúdelo.
Consejo: La entrada de muestra corresponde a esta figura. De esta figura, puede ver que la computadora más alejada de la computadora 1 es la computadora 4, y la distancia entre ellas es 3. La Computadora No. 4 y la Computadora No. 5 son los puntos más lejanos de la Computadora No. 2, entonces la respuesta es 2. La Computadora No. 5 está más alejada de la Computadora No. 3, entonces para la Computadora No. 3, su respuesta es 3. Del mismo modo, podemos calcular que la respuesta para la computadora 4 y la computadora 5 es 4.

Entrada:

El archivo de entrada contiene múltiples conjuntos de datos de prueba. Para cada conjunto de datos de prueba, la primera línea es un número entero N (N <= 10000), luego hay líneas N-1, dos números en cada línea, y para los dos números en la línea i-ésima, representan el número conectado a la computadora i El número de la computadora y la longitud del cable de red entre ellos. La longitud total del cable de red no excederá de 10 ^ 9, y cada número está separado por un espacio.

Salida

Para cada conjunto de datos de prueba, se emiten N líneas y la línea i-ésima representa la respuesta de la computadora i (1 <= i <= N).

Entrada de muestra

5
1 1
2 1
3 1
1 1

Salida de muestra

3
2
3
4
4

Ideas:

Si se requiere el diámetro del árbol, el problema solo necesita pasar por dfs dos veces, pero este problema es encontrar la longitud de cadena más larga desde cada punto del árbol, y luego se debe comparar la distancia entre cualquier nodo y los dos extremos del diámetro del árbol. Es decir, dfs tres veces.
Elija un punto 0, busque en profundidad desde 0 para encontrar el punto x más alejado de él, encuentre la distancia d1 [] desde cada punto en el árbol hasta x, luego comience la búsqueda profunda desde x para encontrar el punto más alejado de x, y luego Asigne a x, luego encuentre la distancia d2 [] desde cada punto en el árbol hasta x, luego la longitud de la cadena más larga a partir del punto i-ésimo es max (d1 [i], d2 [i]).

Código:

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int maxn = 10010;
int head[maxn], d1[maxn], d2[maxn], x, n, tot;
struct edge 
{ 
	int to, next, w;
}edges[2 * maxn];

void add(int u, int v, int w) 
{
	edges[tot] = { v, head[u], w };
	head[u] = tot;
	tot++;
}

void dfs(int u, int f, int* d) 
{
	for (int e = head[u]; e != -1; e = edges[e].next) 
	{
		int to = edges[e].to;
		if (to != f)
		{
			d[to] = d[u] + edges[e].w;
			if (d[x] < d[to])
				x = to;
			dfs(to, u, d);
		}
	}
}

int main() 
{
	int v, w;
	while (scanf_s("%d", &n)!=EOF) 
	{
		memset(head, -1, sizeof(head));
		tot = 0;
		for (int i = 2; i <= n; i++) 
		{
			scanf_s("%d%d", &v, &w);
			add(i, v, w);
			add(v, i, w);
		}
		d1[x] = 0;
		dfs(1, -1, d1);
		d1[x] = 0;
		dfs(x, -1, d1);
		d2[x] = 0;
		dfs(x, -1, d2);
		for (int i = 1; i <= n; i++)
			printf("%d\n", max(d1[i], d2[i]));
	}
	return 0;
}

32 artículos originales publicados · Me gusta0 · Visitas 681

Supongo que te gusta

Origin blog.csdn.net/qq_43814559/article/details/105253234
Recomendado
Clasificación