Bob in Wonderland(思維+構造)

小菜雞加油發表於2020-10-02

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


思路:比較明顯的造幾個資料去模擬發現最小的次數就是葉節點的個數-1.但是這夠了嗎?wa了一發發現需要從節點度數是1的地方開始dfs去求。造了個資料發現在中間的時候以中間那個點為根會導致多出葉子節點來。

以其中一個葉子節點為根進行構造,這樣葉子個數就最少了。

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

 

相關文章