这个题的意思是树的所有连通量的个数之和, 我们定义g[i]为以i为根的子数的个数, f[i]为以i为根的所有连通分量元素个数之和, 那么f[u] = f[u]*(g[v]+1) + f[v]*g[u]; g[u] = g[u]*(g[v]+1); 然后在回溯的时候计算一下即可, 代码如下:
#include#include #include using namespace std;typedef long long LL;const LL m = 1e9+7;vector G[200000 + 100];int n;LL g[200000+100];LL f[200000+100];LL ans;void dfs(int u, int pre){ g[u]=1; f[u]=1; for(int i=0; i