Asignación de peso de borde

D - Asignación de peso de borde

Referencia: Codeforces Round # 633 Editorial

Creo que la clave de esta pregunta es que el gráfico debe transformarse en un árbol, de modo que la lógica sea mucho más clara.

Si hay un número impar (no 1) entre las hojas, entonces el valor f más pequeño debe ser 3; de lo contrario, es 1. Se puede obtener resolviendo la distancia desde otros nodos hoja a un determinado nodo hoja, y la conclusión es válida para cualquier nodo (es decir, si el nodo está satisfecho, entonces los otros nodos también están satisfechos).

Otra conclusión muy importante es que si hay una situación en la que un nodo primario conecta dos nodos hoja, entonces el valor máximo de f debe reducirse en 1, porque el valor del nodo hoja se ha determinado, no puede haber otros cambios.

// Created by CAD on 2020/4/13.
#include <bits/stdc++.h>
using namespace std;

const int maxn=1e5+5;
vector<int> e[maxn];
bool bj=0;
void dfs(int u,int fa=0,int x=0){
    for(auto i:e[u])
        if(i!=fa) dfs(i,u,x^1);
    if(e[u].size()==1&&x) bj=1;
}
int vis[maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
//    FOPEN;
    int n;cin>>n;
    for(int i=1,x,y;i<=n-1;++i)
        cin>>x>>y,e[x].push_back(y),e[y].push_back(x);
    for(int i=1;i<=n;++i)
        if(e[i].size()==1){
            dfs(i);break;
        }
    int ans=n-1;
    for(int i=1;i<=n;++i)
        if(e[i].size()==1)
            ans-=vis[e[i][0]],vis[e[i][0]]=1;
    cout<<(bj?3:1)<<" "<<ans<<"\n";
    return 0;
}

Supongo que te gusta

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