Linova y el reino

C - Linova y Reino

Referencia: Codeforces Round # 635 Editorial

La primera regla a saber es que si una ciudad es una ciudad industrial, entonces todos sus nodos secundarios también deben ser ciudades industriales. Puede ser probado por la ley de contra-evidencia.

Entonces podemos obtener la contribución de cada ciudad turística como (profundidad de nodo de tamaño de subárbol), y el método de prueba se puede ver en la solución oficial.

Si no hay idea, primero puede deducir las reglas y luego resolver de acuerdo con las reglas obtenidas. Si puede convertir el análisis de todo el gráfico en un análisis independiente de un punto, entonces es muy fácil.

// Created by CAD on 2020/4/17.
#include <bits/stdc++.h>

#define ll long long
using namespace std;

const int maxn=2e5+5;
vector<int> g[maxn];
int son[maxn],d[maxn];
void dfs(int x,int fa,int deep){
    son[x]=1;
    for(auto i:g[x])
        if(i!=fa) dfs(i,x,deep+1),son[x]+=son[i];
    d[x]=son[x]-deep;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,k;    cin>>n>>k;
    for(int i=1,x,y;i<=n-1;++i)
        cin>>x>>y,g[x].push_back(y),g[y].push_back(x);
    dfs(1,0,1);
    sort(d+1,d+n+1,greater<int>());
    ll sum=0;
    for(int i=1;i<=n-k;++i) sum+=d[i];
    cout<<sum<<"\n";
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/CADCADCAD/p/12719936.html
Recomendado
Clasificación