不思議の国のボブ(思考+構造)

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


アイデア:シミュレートするデータをいくつか作成して、最小回数がリーフノードの数-1であることを確認する方が明白です。しかし、これで十分ですか?waは、ノード次数が1の場所からdfsを開始する必要があることを発見しました。データを作成し、中間点を中央のルートとして使用すると、より多くのリーフノードが発生することがわかりました。

リーフノードの1つをルートとして作成し、リーフの数が最小になるようにします。

#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;
}

 

おすすめ

転載: blog.csdn.net/zstuyyyyccccbbbb/article/details/108904497