https://www.luogu.org/problemnew/show/P4268
题意:选一个文件夹为当前目录,求到所有文件的需要打的字符数之和最小的那个当前目录。
思路:看成一棵树,文件夹当中间结点,文件当成叶子,求的就是:选一个中间结点,使其到所有叶子的距离和最小。
先求根节点的总路径长度,同时把各结点下叶子总个数求出来,再依次由父节点的总路径长度推出子结点的总路径长度
对于一个结点u,u下面的叶子路径长度全部减去u的长度+1(/),其他不在u下面的叶子结点全部加上3(../)。
注意要开long long。
#include<bits/stdc++.h>
using namespace std;
#define maxn 100000+100
long long n,len[maxn],file[maxn],ans;
vector<long long> son[maxn];
long long dfs(long long u,long long num)
{
long long ans=0;
if(son[u].size()==0)return num+len[u];
for(long long i=0;i<son[u].size();i++)ans+=dfs(son[u][i],num+len[u]+1);
return ans;
}
long long dfs2(long long u)
{
if(son[u].size()==0