Codeforces 1337C - Linova y Reino (贪心)


Titulo

Problema




Titulo

Dado un árbol de n nodos y n-1 bordes, tome el nodo 1 como raíz

Ahora necesitamos seleccionar k nodos como ciudades industriales, y las ciudades restantes son todas ciudades turísticas

P. De todas las ciudades industriales fue a la raíz de la ciudad turística que pasa el número máximo de la suma de




Ideas para resolver problemas

Pensamiento inverso, suponiendo que todo el mapa es todas las ciudades industriales, entonces debemos seleccionar nk ciudades turísticas

Dado que el nodo 1 es la raíz del árbol, para cada nodo, podemos calcular la cantidad de nodos contenidos en el subárbol enraizado en este nodo y la cantidad de nodos ancestrales que posee este nodo

Se puede encontrar que, según la codicia, las ciudades turísticas que elegimos están todas lo más cerca posible del nodo raíz

No hay duda de que el primer paso debe ser seleccionar el nodo raíz como ciudad turística, luego nuestra respuesta en este momento es n-1 , es decir, el número de ciudades industriales en este momento

Tome la foto de la muestra uno como ejemplo

PIC1

El primer paso es elegir 1 como ciudad turística, y la respuesta es 6, que es el número de ciudades industriales.

Entonces el segundo paso

  Si elegimos 3 como la ciudad turística, podemos encontrar que una ciudad turística se agrega a la ruta del nodo 5 y el nodo 6, por lo que la respuesta en este momento es 6-1 + 2 = 7

  Si elegimos 4 como la ciudad turística, podemos encontrar que una ciudad turística se agrega a la ruta del nodo 7, por lo que la respuesta en este momento es 6-1 + 1 = 6

  Por lo demás, si elige 2 5 6 7 como ciudad turística, ninguna otra ciudad industrial pasará por estas ciudades turísticas, y la respuesta será 6-1 + 0 = 5


En resumen, si luego seleccionamos un determinado nodo i como ciudad turística,

Entonces, la "mayor contribución" a la respuesta es el número de nodos contenidos en el subárbol enraizado en el nodo i (excluyendo el nodo i)

La "contribución reducida" a la respuesta es el número de ciudades turísticas en todos los nodos ancestros del nodo i

Y debido a que somos codiciosos, podemos aumentar (aumentar la contribución) o disminuir (disminuir la contribución) para obtener el valor máximo de la respuesta

Y cuanto más cerca esté el nodo del nodo raíz, mayor será el número de nodos secundarios y menor será el número de nodos ancestrales, definitivamente tendrá prioridad

Por lo tanto, la contribución de cada nodo de las respuestas se puede convertir en - subárbol con raíces en el nodo i (no incluyendo el nodo i) que comprende un número de nodos del número de antepasado nodos del nodo i

Clasifíquelo después del procesamiento, luego tome nk desde el principio




Programa completo

Deje que la profundidad del nodo raíz 1 sea 0

Luego, el número de nodos ancestros de cada nodo se convierte en la profundidad de cada nodo

Para el número de nodos contenidos en el subárbol enraizado en el nodo i (excluyendo el nodo i) , se pueden agregar dfs recursivamente

(Pruebas previas: 264 ms / 2000 ms)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

vector<int> G[200050];
bool vis[200050];

struct node
{
    int cnt,dis; //cnt存子树除该节点外的节点数量,dis存节点深度
    bool operator < (const node& a) const
    {
        return cnt-dis>a.cnt-a.dis; //按照对答案的贡献(cnt-dis)从大到小排序
    }
}ar[200050];

int dfs(int pos,int fa)
{
    vis[pos]=true; //标记访问
    ar[pos].dis=ar[fa].dis+1; //节点深度=父节点节点深度+1
    for(int it:G[pos])
        if(!vis[it])
            ar[pos].cnt+=dfs(it,pos); //求除自己以外子树中节点数量之和
    return ar[pos].cnt+1; //返回时要加上自己
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int n,k,a,b;
    cin>>n>>k;
    for(int i=1;i<n;i++)
    {
        cin>>a>>b;
        G[a].push_back(b);
        G[b].push_back(a);
    }
    ar[0].dis=-1; //特殊处理下,dis[1]=dis[0]+1=0 -> dis[0]=-1
    dfs(1,0);
    sort(ar+1,ar+n+1);
    ll ans=0;
    for(int i=1;i<=n-k;i++)
        ans+=ar[i].cnt-ar[i].dis;
    cout<<ans<<'\n';

    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/stelayuri/p/12709923.html
Recomendado
Clasificación