Vacaciones de invierno 2020 [gmoj2412] [clocktree] [DFS + lista de adyacencia]

Descripción del título

El diseño del nuevo bullpen del granjero John es muy extraño: consta de N habitaciones numeradas 1 ... N (2≤N≤2500) y N-1 corredores. Cada corredor conecta dos habitaciones para que cada habitación pueda alcanzar cualquier otra habitación a lo largo de algunos corredores.
Cada habitación en el bullpen está equipada con un reloj redondo con números enteros estándar 1 ... 12 impresos en el dial. Sin embargo, estos relojes tienen solo una mano y siempre apuntan directamente a un número en el dial (nunca señala entre dos números).
Cow Bessie quiere sincronizar todos los relojes en el establo para que todos apunten al número entero 12. Sin embargo, su mente es un poco más simple, y cuando camina en el establo, cada vez que entra en una habitación, mueve la manecilla del reloj hacia atrás en una posición. Por ejemplo, si el reloj original apuntó a 5, ahora apuntará a 6, si el reloj original apuntó a 12, ahora apuntará a 1. Si Bessie entra en la misma habitación varias veces, girará el reloj en esta habitación cada vez que entre.
Solicite el número de posibles salas de salida para Bessie para que pueda caminar alrededor del bullpen y dirigir todos los relojes a las 12. Tenga en cuenta que Bessie no gira el reloj en su sala de embarque, pero lo hará en cualquier momento cuando vuelva a entrar. El reloj no se moverá solo; el reloj solo se moverá cuando Bessie entre. Además, una vez que Bessie ingresa a un corredor, debe llegar al otro extremo del corredor (no se le permite caminar hasta la mitad de la habitación original).

De entrada

La primera línea de entrada contiene N. La siguiente línea contiene N enteros, todos en el rango 1 ... 12, que indican la configuración inicial del reloj para cada habitación. Cada una de las siguientes líneas N − 1 describe un corredor con dos enteros a y b, los cuales están en el rango 1 ... N, y son los números de las dos habitaciones conectadas por el corredor.

Salida

Al emitir el número de salas de salida, Bessie puede señalar todos los relojes a 12.

Entrada de muestra

4
11 10 11 11
1 2
2 3
2 4

Salida de muestra

1

Limitación del rango de datos

Los puntos de prueba 1-7 satisfacen N≤100.
Los puntos de prueba 8-15 no tienen restricciones adicionales.

Pronto

En este ejemplo, Bessie puede señalar los relojes de todas las habitaciones a 12 (por ejemplo, pasar a las habitaciones 1, 2, 3, 2 y finalmente a 4) si y solo cuando sale de la habitación 2.

Análisis

Para este problema, podemos enumerar una habitación i como raíz a la vez y actualizar las habitaciones conectadas a ella. Dado que la pregunta es verificar si se puede completar, es posible que deseemos verlo con avidez y caminar de un lado a otro entre padre e hijo cada vez, hasta que el niño cambie a 12, en este momento de acuerdo con la diferencia entre padre e hijo, podemos saber qué es usted. Luego ve al siguiente hijo y determina el valor de u. Hasta que se corrija a todos los niños, en este momento se fija un número determinado. Volviendo al nivel anterior, el padre te cambió a 12.
Entonces, en esta ronda, al final, a excepción de la raíz, los otros puntos son todos 12. Si la raíz es exactamente 12, significa que es posible. ¿Qué pasa si la raíz no es 12? De hecho, la raíz es 1 porque se detiene en el último hijo de la raíz y no retrocede. En este momento, el tiempo entre la raíz y el último hijo será uno. Excepto por estos dos casos, nada más.
if (edge ​​[i] .y == v) continue;
asegúrese de agregar esta oración , de lo contrario se repetirá sin cesar
: debido a que el título estipula que dos habitaciones son bordes bidireccionales, por lo que para cualquier punto, su hijo también es su padre ¡Pero estipulamos que solo un punto debería arraigarse! !

Código en

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,a[5000],tot,t[5000],h[5000],ans;
struct node
{
	int x,y,next;
}b[5000];
void add(int xx,int yy)//邻接表 
{
	tot++;
	b[tot].x=xx;
	b[tot].y=yy;
	b[tot].next=h[xx];
	h[xx]=tot;
}
void dfs(int u,int v)
{
	for(int i=h[u];i;i=b[i].next)
	{
		if(b[i].y==v) continue;
		dfs(b[i].y,u);
		t[u]=(t[u]-t[b[i].y]+12)%12;
	}
} 
int main()
{
    freopen("clocktree.in","r",stdin);
    freopen("clocktree.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	cin>>a[i];
    	a[i]%=12;//如果是12的话变成0 
	}
	int x,y;
	for(int i=1;i<=n-1;i++)
	{
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	for(int i=1;i<=n;i++)
	{
		memcpy(t,a,sizeof(t));//百度找的,把a的所有东西复制到t里面
		dfs(i,0);//枚举根 
		if(t[i]==0||t[i]==1) ans++;//走一圈之后根是0或1都可以,是0就停下,是1就踩上去 
	}
	cout<<ans; 
    fclose(stdin);
    fclose(stdout);
    return 0;
}

110 artículos originales publicados · 100 alabanzas · 8000 visitas

Supongo que te gusta

Origin blog.csdn.net/dglyr/article/details/105678451
Recomendado
Clasificación