Bob en el país de las maravillas (pensamiento + estructura)

https://ac.nowcoder.com/acm/contest/7817/C


Idea: Es más obvio crear algunos datos para simular y encontrar que el menor número de veces es el número de nodos hoja: 1. ¿Pero es esto suficiente? wa descubrió que necesita iniciar dfs desde donde el grado del nodo es 1. Creó un dato y descubrió que tomar el punto medio como la raíz en el medio provocará más nodos de hojas.

Tome uno de los nodos de las hojas como raíz para construir, de modo que el número de hojas sea el mínimo.

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=3e5+100;
typedef long long LL;
vector<LL>g[maxn];
LL deg[maxn];
bool vis[maxn];
LL sum=0;
void dfs(LL u,LL fa)
{
    for(LL i=0;i<g[u].size();i++)
    {
        LL v=g[u][i];
        if(!vis[v]&&v!=fa)
        {
            vis[v]=true;
            if(deg[v]==1) sum++;
            dfs(v,u);
        }
    }
}
int main(void)
{
  cin.tie(0);std::ios::sync_with_stdio(false);
  LL n;cin>>n;
  if(n==1){
    cout<<0<<endl;return 0;
  }
  for(int i=1;i<n;i++){
    LL x,y;cin>>x>>y;
    g[x].push_back(y);g[y].push_back(x);
    deg[x]++;deg[y]++;
  }
  ///vis[1]=true;
  ///dfs(1,-1);
  for(LL i=1;i<=n;i++){
    if(deg[i]==1){
        vis[i]=true;
        dfs(i,-1);
        cout<<sum-1<<endl;
        return 0;
    }
  }
 /// cout<<sum-1<<endl;
  return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/zstuyyyyccccbbbb/article/details/108904497
Recomendado
Clasificación