Compensa el trabajo (árbol dp)

Compensar

Descripción

Como experto en espías, Elvis Han ha sido robado de la inteligencia secreta del centro militar del Planeta X y ha entrado con éxito en el centro militar. Pero desafortunadamente, fue descubierto antes de encontrar la misión y necesitaba inteligencia. En este momento, sabía que no podía completar la misión, pero aún tenía la posibilidad de compensarlo, es decir, de obtener alguna otra inteligencia que no fuera tan valiosa como la inteligencia de la misión. Si el valor total de la inteligencia obtenida es mayor o igual al valor de la inteligencia de la misión, no será sancionado. Afortunadamente, ha obtenido el mapa del centro militar. La inteligencia está escondida en varios caminos, pero solo tiene tiempo para atravesar un cierto número de caminos (¡el tiempo es precioso! Tienes que huir ...) Ahora eres su asistente , Te doy el mapa y el valor de inteligencia de cada camino, espero que puedas analizarlo y ver si puede compensarlo.
  El centro militar es un árbol binario estricto, es decir, si hay un punto que se puede dividir, se debe dividir, y solo se dividen dos caminos. Ahora Elvis Han está en la primera división, lo que significa que el árbol En el nodo raíz. Cada camino tiene una puntuación, que es el valor de la inteligencia en este camino. Pero solo tiene tiempo para tomar las carreteras M. La suma de su valor de inteligencia final es la suma del valor de inteligencia de la carretera que recorre (suponiendo que pueda obtener toda la información sobre la carretera que ha recorrido). Espero que pueda dar un plan para que pueda tanto como sea posible. Obtenga información para compensarlo.

Entrada

Hay un total de N filas: la
primera fila: 3 datos: N, M, Q (N indica cuántas intersecciones hay, incluidas las intersecciones divididas y no divididas; M indica el número total de carreteras que puede tomar tiempo; Q indica su Valor de la inteligencia de la misión)
Línea 2 ~ N: 3 datos en cada línea, Xi, Yi, Wi (X, Y representan las dos intersecciones conectadas por la primera carretera, W representa el valor de la inteligencia en esta carretera, nota, Todos los datos están dentro del rango de Lonint)

Salida

Contiene 2 líneas: la
primera línea: salida VERDADERO / FALSO (tenga en cuenta el caso), que indica si puede recopilar suficiente valor de inteligencia de la misión. La
segunda línea: generar un dato:
si puede completar la misión, generar el valor total de la inteligencia que recopiló La parte que excede el valor de la inteligencia de la misión. (Número positivo)
Si la tarea no se puede completar, se emitirá un número para indicar que no le quedan muchos puntos para que sean suficientes para el valor de inteligencia de la misión. (numero negativo)

Entrada de muestra

【Entrada de muestra 1】

3 1 10
1 2 10
1 3 8

【Entrada de muestra 2】

9 3 49
6 2 15
7 2 10
8 7 6
7 9 15
1 3 20
2 1 10
4 3 8 
3 5 7

Salida de muestra

[Salida de muestra 1]

TRUE
0

Descripción de la muestra: (esta parte no necesita ser impresa)

3	 2
\(8) /(10)
  1   (选择1条路当然选1-2

[Salida de muestra 2]

FALSE
-4

Descripción de la muestra:

8	9
\  /
 6 7  4 5
 \ /  \ /
  2    3
  \    /
    1
(由于他最大可以取得的是[1->3]+[1->2]+[2->6]3条路径的价值,才45,所以不可能完成任务)

Insinuación

<Escala de datos>
Para el 30% de los datos, N <= 10,
para el 50% de los datos, N <= 40,
para todos los datos, N <= 100

La idea es la
misma que la del manzano binario .

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#define ll long long
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
const int N=1e2+10;
struct node
{
    
    
	int u,v,w,next;
} e[2*N];
int n,m,hd[N],tot,f[N][N],sz[N],q;
void add(int x,int y,int w) {
    
    e[++tot]=(node){
    
    x,y,w,hd[x]};hd[x]=tot;}
void dfs(int u,int fa)
{
    
    
	for(int i=hd[u];i;i=e[i].next)
	{
    
    
		int v=e[i].v;if(v==fa) continue;
		dfs(v,u);sz[u]+=sz[v]+1; 
		for(int j=min(m,sz[u]);j>=0;j--)   
			for(int k=min(j-1,sz[v]);k>=0;k--)  
				f[u][j]=max(f[u][j],f[u][j-k-1]+f[v][k]+e[i].w);
	}
}
int main()
{
    
    
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<n;i++)
	{
    
    
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);  
		add(v,u,w);
	}
	dfs(1,-1);  
	if(f[1][m]<q) printf("FALSE\n");
	else printf("TRUE\n");
	printf("%d",f[1][m]-q);
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/bigwinner888/article/details/108024202
Recomendado
Clasificación