Un trabajo week6

Significado de las preguntas:
laboratorio originalmente tiene un ordenador (Nº 1), recientemente kriptón división de banda de oro cuco Oriente, sino también para la compra de equipos de laboratorio N-1, número 2 a N. Cada ordenador conectado a un ordenador con un cable instalado previamente. Pero cuco Medio velocidad de preocupación es demasiado lento, lo que quería saber el cable de red i-computadora a una longitud máxima de otros equipos, pero pobre del este de cuco sufrió recientemente una caída de la sabiduría de los rayos cósmicos, ayuda por favor él.
Aquí Insertar imagen Descripción
Nota: esta figura corresponde a la muestra de entrada, a partir de esta figura se puede ver, el número 1 más alejado del equipo es un equipo PC 4, la distancia entre ellos es de 3. No. 4 y No. 5 ordenadores PC son más alejado del punto de la computadora 2, así que la respuesta es No. 2.5 No. 3 más alejada de la PC de la computadora, el ordenador 3 es así que para su respuesta es 3. Podemos calcular los mismos números 4 y 5, la respuesta del ordenador PC es 4.
ENTRADA:
el archivo de entrada contiene varios datos de prueba. Para cada prueba, la primera fila de un número entero N (N <= 10000), hay N-1 la siguiente fila, cada fila dos números, para la i-ésima fila de los dos números que representan el número de ordenadores conectados a la i número de equipo y la longitud del cable entre ellos. La longitud total del cable no exceda de 10 ^ 9, separadas por un espacio entre cada número.
salida:
(. 1 <= i <= N). Para cada conjunto de línea de salida de datos de prueba N, el número i representa el i-ésimo respuestas de ordenador fila
de entrada de muestra:
. 5
. 1. 1
2. 1
. 3. 1
. 1. 1
Resultado de muestra:
. 3
2
3.
4.
4.
ideas:
Significado de las preguntas se resuelven mediante el uso de un método conocido árbol. , Atravesada por un lado DFS de almacenamiento delantero estrella. La primera vez que se inicie el nodo v1 búsqueda desde el punto más alejado de cualquier, el segundo paso, desde el punto de inicio de la búsqueda nodo v1 v2 desde el punto más lejano, el diámetro de la distancia entre v1 y v2 es árbol. V2 a partir del tercer pase del punto de inicio de búsqueda, ya que durante el recorrido, el segundo paso cada punto del punto de distancia v1 almacenado, el tercer paso de cada punto de la distancia al punto v2 almacenada mediante la comparación del tamaño de la , la distancia desde cada punto y v1, v2, la distancia será lejos de la matriz almacenada, obtiene el i-ésimo equipo con otros equipos de la longitud máxima del cable y salidas.

código:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{
	int begin;
	int end;
	int value;
	int next;
}temp[100050];
int cm=1;
int a[100050];
int n;
int vis[100050];
int bm[100050];
int dm[100050];
void init(int &n)
{
	//cm=1;
	cm=0;
	for(int i=0;i<=n;i++)
	{
		a[i]=-1;
		vis[i]=0;
		bm[i]=0;
		dm[i]=0;
	}
 } 
void edge(int begin,int end,int value)
{
	temp[cm].begin=begin;
	temp[cm].end=end;
	temp[cm].value=value;
	temp[cm].next=a[begin];
	a[begin]=cm;
	cm++;
}

int v1=0;
int v2=0;
void dfs1(int begin)
{
	vis[begin]=1;
	for(int i=a[begin];i!=-1;i=temp[i].next)
	{
		if(bm[temp[i].end]==-1)
		//if(!vis[temp[i].end])
		{
			vis[temp[i].end]=1;
			bm[temp[i].end]=bm[temp[i].begin]+temp[i].value;
			if(bm[temp[i].end]>bm[v1])
			{
				v1=temp[i].end;
			}
			dfs1(temp[i].end);
		}
	}
}
void dfs2(int begin)
{
	vis[begin]=1;
	for(int i=a[begin];i!=-1;i=temp[i].next)
	{
		if(bm[temp[i].end]==-1)
		//if(!vis[temp[i].end])
		{
			vis[temp[i].end]=1;
			bm[temp[i].end]=bm[temp[i].begin]+temp[i].value;
			if(bm[temp[i].end]>bm[v2])
			{
				v2=temp[i].end;
			}
			dfs2(temp[i].end);
		}
	 } 
}
void dfs3(int begin)
{
	vis[begin]=1;
	for(int i=a[begin];i!=-1;i=temp[i].next)
	{
		if(dm[temp[i].end]==-1)
		//if(!vis[temp[i].end])
		{
			vis[temp[i].end]=1;
			dm[temp[i].end]=dm[temp[i].begin]+temp[i].value;
			if(dm[temp[i].end]>bm[temp[i].end])
			{
				bm[temp[i].end]=dm[temp[i].end];
			}
			dfs3(temp[i].end);
		}
	 } 
}
int main()
{
	int end;
	int value;
	while(cin>>n)
	{
		init(n);
		for(int i=2;i<=n;i++)
		{
			cin>>end>>value;
			edge(end,i,value);
			edge(i,end,value);
		}
		for(int i=0;i<=n;i++)
		{
			bm[i]=-1;
		}
		bm[1]=0;
		dfs1(1);
		for(int i=0;i<=n;i++)
		{
			bm[i]=-1;
			//bm[i]=0;
		}
		bm[v1]=0;
		dfs2(v1);
		for(int i=0;i<=n;i++)
		{
			dm[i]=-1;
			//dm[i]=0;
		}
		dm[v2]=0;
		dfs3(v2);
                for(int i=1;i<=n;i++)
		{	cout<<bm[i]<<endl;
		}
	}
	return 0;
}
Se han publicado 19 artículos originales · ganado elogios 0 · Vistas 204

Supongo que te gusta

Origin blog.csdn.net/weixin_45117273/article/details/105333245
Recomendado
Clasificación