题目描述如下
1、数据结构选择
树是图的退化,所以采用二位数组的形式对树进行存储。
构建形式 vector G[N] ;
要看数据是怎样输入的,进而采用不同的构建方法
我的感觉是,看题目怎么说,要是明确指出是树,那就单向存储,
要是说是图,但它还是树,那就建立双向的联系。
对于双向树:
有几个技巧,
1:求结点的子分支数
(g[v].size() - (p != -1));
2:只找找该结点的子代,不找父代
if (u != p){
...
}
对于单向树:
暂时没想到,就是顺着往下找吧
2、算法(深搜)
读懂题意,并进行子问题的分解很关键,要深搜,不可能像数学公式一样带入数直接求得最终结果。
深搜的函数名不写成dfs了,感觉那样写在式子推导的时候不容易看出递归的关系
#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
const int maxn = 2e5 + 17;
int n;
vector<int> g[maxn];
long double Expect(int v = 0, int p = -1) {
long double expect = 0;
for (auto u : g[v])
if (u != p)
expect += Expect(u, v) + 1;
if(expect)return expect / (g[v].size() - (p != -1));
else return 0;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n;
for (int v, u, i = 1; i < n; i++) {
cin >> v >> u, v--, u--;
g[v].push_back(u);
g[u].push_back(v);
}
cout << fixed << setprecision(7) << Expect() << '\n';
return 0;
}